我有一个带有Adapter和ViewHolder类的RecyclerView,所以它是3个类,我在ViewHolder中添加了一个onLongClick,当它长时间点击时,所选项目将被删除,我将其删除如下: / p>
MyRV.Items.remove(getLayoutPosition());
MyRV.mAdapter.notifyItemRemoved(getLayoutPosition());
项目:
Item_5
Removing Item 2 - Item 2 removed .
Removing Item 3 (which is item 2 now) - Item 1 removed (item - 1) .
我的数据项目大约有7项,所以这就是正在发生的事情。当第一次删除时,它会删除正确的项目,当您再次单击删除时,它会删除上面的项目而不是删除所选项目,当大小为1时,它会因为无效大小而触及FC。
我的问题与此类似:using notifyItemRemoved or notifyDataSetChanged with RecyclerView in Android
但是答案不起作用,没有一个,从itemRange到index + 1。
public class MyAdapterextends RecyclerView.Adapter<MyViewHolder> {
private List<MyItem> itemList;
public Context context;
public MyAdapter(Context context, List<MyItem> itemList) {
this.itemList = itemList;
this.context = context;
}
@Override
public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View layoutView = LayoutInflater.from(parent.getContext()).inflate(R.layout.myitem, null);
return new MyViewHolder(layoutView);
}
@Override
public void onBindViewHolder(final MyViewHolder holder, final int position) {
holder.From.setText(itemList.get(holder.getAdapterPosition()).getFrom());
holder.To.setText(itemList.get(holder.getAdapterPosition()).getTo());
}
@Override
public int getItemCount() {
return this.itemList.size();
}
}
活动
LinearLayoutManager LinLayout = new LinearLayoutManager(MyActivity.this, LinearLayoutManager.VERTICAL, false);
mAdapter = new MyAdapter(MyActivity.this, Items);
RcView.setItemAnimator(new ItemAnimator());
RcView.setHasFixedSize(true);
RcView.setLayoutManager(LinLayout);
RcView.setAdapter(mAdapter);
答案 0 :(得分:2)
试试:
Sheet2
答案 1 :(得分:1)
好的,我们来解释一些基本的东西。
首先,notifyDataSetChanged()
从适配器列表中刷新完整的RV布局,从而终止所有动画。我们不希望这样。
创建房车也是为了节省电池,如果我们一直打电话,这种方法我们做得不好。
要删除项目,请将其从列表(ArrayList)中删除,然后在调用notifyItemRemoved(the index of the item you just removed)
后删除。动画执行。无需致电notifyItemChanged()
!这样做会触发该位置项目的新绑定。
不要使用getLayoutPosition()
它将代表布局中的位置而不是适配器中列表的位置。要知道您必须致电getAdapterPosition()
的实际位置。
请勿在约束中调用holder.getAdapterPosition()
,您已拥有position
!
现在,您不需要为每个项目重新创建一个新的适配器,因此,请考虑采用此库FlexibleAdapter,因为它将处理开箱即用的所有基本功能(您不需要扩展它);您可以为所需的每种视图类型自定义项目; ViewHolder是预定义的:已经实现了常见事件(单击和长击);它在旋转后保持状态还有更多......