首页 > 解决方案 > 如何实时更新recyclerview项目中的序列号文本

问题描述

我有一个 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)
        }
    }

标签: androidandroid-studiokotlinandroid-recyclerview

解决方案


您需要通过从 发送位置从列表中删除该项目RecyclerView,一旦您这样做,该项目的位置将被更新。

您可以通过使适配器看到您的类中的列表来做到这一点,因为它可以从中删除。


推荐阅读