【发布时间】:2020-03-23 16:46:52
【问题描述】:
我有一个 RecyclerView,它在每个列表项的开头显示一系列数字,如下所示。
我通过获取项目在列表中的位置并添加一个来做到这一点。
onBindViewHolder
override fun onBindViewHolder(holder: ViewHolder, position: Int) {
val item = getItem(position)
holder.bind(item!!, clickListener)
holder.numberTextView.text = position.plus(1).toString()
}
我希望在删除列表中的项目时实时更新数字。截至目前,当我删除 recyclerview 中的项目时,我得到一个如下所示的列表。我必须刷新布局以获取顺序编号列表。如何实时更新数字。
我的适配器
class Adapter(
private val clickListener: ClickListener) :
ListAdapter<DataItems, Adapter.ViewHolder>(DiffCallback()) {
class DiffCallback : DiffUtil.ItemCallback<DataItems>() {
override fun areItemsTheSame(oldItem: DataItems, newItem: DataItems): Boolean {
return oldItem.itemId == newItem.itemId
}
@SuppressLint("DiffUtilEquals")
override fun areContentsTheSame(oldItem: OrderSummary, newItem: OrderSummary): Boolean {
return oldItem == newItem
}
}
fun getItemAtPosition(position: Int): DataItems {
return getItem(position)
}
override fun onBindViewHolder(holder: ViewHolder, position: Int) {
val item = getItem(position)
holder.bind(item!!, clickListener)
holder.umberTextView.text = position.plus(1).toString()
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
return ViewHolder.from(parent)
}
class ViewHolder private constructor(val binding: ItemBinding) :
RecyclerView.ViewHolder(binding.root) {
val numberTextView = binding.orderItemListNumber
fun bind(
item: DataItems,
clickListener: SummaryItemListener
) {
binding.clickListener = clickListener
binding.DataItems= item
binding.executePendingBindings()
}
companion object {
fun from(parent: ViewGroup): ViewHolder {
val layoutInflater = LayoutInflater.from(parent.context)
val binding =
ItemBinding.inflate(layoutInflater, parent, false)
return ViewHolder(binding)
}
}
}
}
我如何删除一个项目:
override fun onSwiped(
viewHolder: RecyclerView.ViewHolder,
direction: Int) {
val position = viewHolder.adapterPosition
val item = adapter.getItemAtPosition(position)
if (direction == ItemTouchHelper.LEFT) {
val toast: Toast =
Toast.makeText(
context,
"1 item removed: ${item.name}",
Toast.LENGTH_SHORT
)
toast.setGravity(Gravity.CENTER, 0, 0)
toast.show()
viewModel.delete(item) // Method to delete item from database
}
ViewModel 中的删除方法
fun delete(summary: OrderSummary) {
uiScope.launch {
deleteItem(summary)
}
}
private suspend fun deleteItem(orderSummary: OrderSummary) {
withContext(Dispatchers.IO) {
database.delete(orderSummary)
}
}
【问题讨论】:
-
删除一个item后,使用Adapter.notifyDataSetChanged();在你的情况下应该足够了。
-
我已经尝试过了,但它不适用于 DiffUtil :(
标签: android android-studio kotlin android-recyclerview