好的,这有点复杂,我有一个自定义的RecyclerView适配器,在OnBindViewHolder方法中,我想根据一些不同的变量从recyclerview中删除当前项,但是当我从ArrayList中删除该项并调用{ {1}}我得到:
notifyDataSetChanged();
。
如何从onBindViewHolder中的RecyclerView中删除该项目? ,我不想在设置适配器之前这样做,因为recyclerview中的每个项目都有一个子列表,如果子列表为空,我想删除该项目。感谢您的任何想法和对不起英语的抱歉。
答案 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);
。它不是很干净,但是可以完成要隐藏的视图的工作。