从RecyclerView Android的OnBindViewHolder方法中删除列表中的项目

时间:2016-10-10 23:27:54

标签: java android android-recyclerview

好的,这有点复杂,我有一个自定义的RecyclerView适配器,在OnBindViewHolder方法中,我想根据一些不同的变量从recyclerview中删除当前项,但是当我从ArrayList中删除该项并调用{ {1}}我得到: notifyDataSetChanged();

如何从onBindViewHolder中的RecyclerView中删除该项目? ,我不想在设置适配器之前这样做,因为recyclerview中的每个项目都有一个子列表,如果子列表为空,我想删除该项目。感谢您的任何想法和对不起英语的抱歉。

2 个答案:

答案 0 :(得分:0)

请按照this回答中显示的方法进行操作。

private List<DetectedIssue> issues = new ArrayList<DetectedIssue>();

@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
// - get element from your dataset at this position
// - replace the contents of the view with that element

    holder.button.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            try {
                issues.remove(position);
                notifyItemRemoved(position);
                //this line below gives you the animation and also updates the
                //list items after the deleted item
                notifyItemRangeChanged(position, getItemCount());

            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    });
}

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

PS:从documentation可以看出,如果在运行不必要的进程时只添加,移动或删除项目,则使用notifyDataSetChanged()是不好的做法。

  

此事件未指定数据集的更改内容,强制任何观察者假定所有现有项目和结构可能不再有效。 LayoutManagers将被迫完全重新绑定并重新布局所有可见视图。

如果您希望更改某些活动中的基础arraylist,则必须使用接口与活动进行通信以更改arraylist。

答案 1 :(得分:0)

我知道有点晚了(4年,呵呵),但是我处于相同的解决方案中。如错误所示,实际上不可能从adapter.notifyItemRemoved(position);方法中调用notifyItemRangeChanged(position, getItemCount());notifyDataSetChanged();之类的方法,甚至是更密集的onBindViewHolder,除非它在onClickListener中,在构建布局之后而不是在构建过程中将调用它。 对我来说,一个简单的解决方法是调用datalist.remove(position);,因此,如果重新构建布局,则视图将被省略,然后只需调用holder.itemView.setVisibility(View.GONE);。它不是很干净,但是可以完成要隐藏的视图的工作。