提问者:小点点

Android适配器重绘视图,显示所有相同的原始项目,而不是删除选定项目


我一直试图从我的列表中删除一个项目,以便它在没有删除的项目的情况下进行更新,但是列表似乎会重新绘制自己,并且像以前一样保持显示所有原始项目。 在一小段时间内,它可能会看到项目就像它被移除了一样,但是,由于重绘,所有东西都回到了移除之前的样子。

我尝试了以下几种方法的组合,但在这种情况下,它们似乎都不起作用。

 adapter.notifyItemRangeChanged(position, adapter.itemCount)
 adapter.notifyItemRemoved(position)
 adapter.notifyItemChanged(position)
 adapter.notifyDataSetChanged()

这些是我的档案。 请注意,我正在使用Groupie库来替换默认的RecyclerView。

class RecyclerProductItem(
private val activity: MainActivity,
private val product: Product,
private val onItemClickListener: OnItemClickListener?
) : Item<GroupieViewHolder>() {

override fun bind(viewHolder: GroupieViewHolder, position: Int) {

    viewHolder.apply {

        with(viewHolder.itemView) {
            
            ivTrash.setOnClickListener {
                if (onItemClickListener != null) {
                    Toast.makeText(context, "delete method to be added here", Toast.LENGTH_SHORT).show()
                    onItemClickListener.onClick(viewHolder.adapterPosition)
 // deleteProduct(product.id)
                } 
            }


        }

    }
}


interface OnItemClickListener {
    fun onClick(position: Int) //pass your object types.
}


override fun getLayout() = R.layout.recyclerview_item_row

}

这是我的片段:

class ProductsListFragment : Fragment() {

private lateinit var adapter: GroupAdapter<GroupieViewHolder>


override fun onCreateView(
    inflater: LayoutInflater,
    container: ViewGroup?,
    savedInstanceState: Bundle?
): View? {
    return inflater.inflate(R.layout.fragment_products_list, container, false)
}


override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
    super.onViewCreated(view, savedInstanceState)

    val linearLayoutManager = LinearLayoutManager(activity)
    recyclerView.layoutManager = linearLayoutManager

    adapter = GroupAdapter()
    recyclerView.adapter = adapter

    loadProducts()

}


/**
 * API calls
 */
private fun loadProducts() {

    GetProductsAPI.postData(object : GetProductsAPI.ThisCallback,
        RecyclerProductItem.OnItemClickListener {

        override fun onSuccess(productList: List<JsonObject>) {

            Log.i(LOG_TAG, "successful network call")

            for (jo in productList) {

                val gson = GsonBuilder().setPrettyPrinting().create()
                val product: Product =
                    gson.fromJson(jo, Product::class.java)

                adapter.add(
                    RecyclerProductItem(
                        activity as MainActivity,
                        Product(
                            product.id,
                            product.title,
                            product.description,
                            product.price
                        ), this
                    )
                )

            }

        }

        override fun onClick(position: Int) {
            Log.i(LOG_TAG, position.toString())

            adapter.notifyItemRangeChanged(position, 
adapter.itemCount)

            adapter.notifyItemRemoved(position)

        }

    })

}

}

非常感谢。


共1个答案

匿名用户

简单样本

class GroupAdapter(private val items: MutableList<Any>) : RecyclerView.Adapter<RecyclerView.ViewHolder>() {

fun removeByPosition(position: Int) {
    items.removeAt(position)
    notifyItemRemoved(position)
}