首页 > 解决方案 > 如何从 ViewHolder 中删除一行回收站视图

问题描述

感谢停下来。

不久前有人向我解释说您不应该将数据存储在 中ViewHolder,我明白为什么。但随后它使一些事情变得复杂。

如果用户单击行内的一个,我想删除一个button行。所以我需要访问adapter。但我无法将其存储在ViewHolder. 什么办法?

我也在寻找recyclerview你知道的最好的文章,因为看起来人们不知道在大多数堆栈溢出中他们在谈论什么并给出不好的建议(将数据存储在里面ViewHolder

编辑:我正在尝试一种解决方案,但是当我在适配器中时,getTag 返回 null

这是我的物品和装订:

public final class ItemViewMail extends RecyclerView.ViewHolder {

    private AppCompatImageButton cancelButton;


    public ItemViewMail(View itemView) {
        super(itemView);
        this.cancelButton = itemView.findViewById(R.id.profile_item_edit_email_cancel_image_button);
    }

    public void bind(Data data, View.OnClickListener deleteOnClickListener) {
        this.itemView.setTag(data);

        if (cancelButton != null) {
            cancelButton.setOnClickListener(deleteOnClickListener);
        }
    }

}

我的适配器:

    private ArrayList<Data> rowDataArrayList;

    MyPVPViewAdapter(ArrayList<Data> rowDataArrayList) {
        this.rowDataArrayList = rowDataArrayList;
    }

    @NonNull
    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int itemType) {                    
    return new ItemViewMail(LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.profile_item_edit_email, viewGroup ,false));
    }

    @Override
    public void onBindViewHolder(@NonNull RecyclerView.ViewHolder myViewHolder, int position) {
          ((ItemViewMail) myViewHolder).bind((Data) rowDataArrayList.get(position).getData(), onClickListener);
    }

    @Override
    public int getItemViewType(int position) {
        return rowDataArrayList.get(position).getType();
    }

    @Override
    public int getItemCount() {
        return rowDataArrayList.size();
    }

    View.OnClickListener onClickListener = new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Data data = (Data) v.getTag();
        }
    };

}

标签: androidandroid-recyclerviewandroid-viewholder

解决方案


data class MyItem(val name: String)

class MyViewHolder(itemView: View,
                   private val onRemoveClickListener: View.OnClickListener) : RecyclerView.ViewHolder(itemView) {

    fun bind(item: MyItem) {
        itemView.setOnClickListener(onRemoveClickListener)
        itemView.setTag(item)
        //todo: eg. itemView.name.setText(item.name)
    }
}

class MyRecyclerViewAdapter(private val onRemoveClickListener: View.OnClickListener): RecyclerView.Adapter<MyViewHolder>() {

    var items = listOf<MyItem>()

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): MyViewHolder {
        val view = LayoutInflater.from(parent.context).inflate(R.layout.viewholder_my)
        return MyViewHolder(view, onRemoveClickListener)
    }

    override fun getItemCount(): Int {
        return items.size
    }

    override fun onBindViewHolder(holder: MyViewHolder, position: Int) {
        holder.bind(items[position])
    }

}

现在您可以在您的活动/片段/等中创建 MyRecyclerViewAdapter 并将 onClickListener 作为参数。

class MyActivity: AppCompatActivity() {

    private lateinit var adapter: MyRecyclerViewAdapter 

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        adapter = MyRecyclerViewAdapter(View.OnClickListener { view ->
            val clickedItem = view.getTag() as MyItem
            adapter.items.remove(clickedItem)
            adapter.notifyDataSetChanged()
        })
    }
}

推荐阅读