RecyclerView,notifyItemRemoved有时会删除无效项,notifyDataSetChanged工作正常

时间:2016-10-10 11:26:16

标签: java android android-recyclerview

我有一个带有Adapter和ViewHolder类的RecyclerView,所以它是3个类,我在ViewHolder中添加了一个onLongClick,当它长时间点击时,所选项目将被删除,我将其删除如下: / p>

            MyRV.Items.remove(getLayoutPosition());
            MyRV.mAdapter.notifyItemRemoved(getLayoutPosition());

项目:

  1. ITEM_1
  2. ITEM_2
  3. ITEM_3
  4. ITEM_4
  5. Item_5

    Removing Item 2 - Item 2 removed .
    Removing Item 3 (which is item 2 now) - Item 1 removed (item - 1) .
    
  6. 我的数据项目大约有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);
    

2 个答案:

答案 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是预定义的:已经实现了常见事件(单击和长击);它在旋转后保持状态还有更多......