当前位置: 首页 > 知识库问答 >
问题:

在RecyclerView中,notifyItemRemoved有时被删除为无效项,notifyDataSetChanged工作正常

弓泰
2023-03-14

我有一个带有适配器和ViewHolder类的RecyclerView,所以它是3个类,我在我的ViewHolder中添加了一个onLongClick,当它被长时间单击时,所选项目将被删除,我删除它如下所示:

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

项目:

>

  • Item_1
  • Item_2
  • Item_3
  • Item_4
  • Item_5

    Removing Item 2 - Item 2 removed .
    Removing Item 3 (which is item 2 now) - Item 1 removed (item - 1) .
    

    我的数据项大约有7项,所以下面是发生的情况。第一次删除时,它会删除正确的项目;当您再次单击“删除”时,它将删除上述项目,而不是删除选定项目;当大小为1时,它是FC,因为大小无效。

    我的问题与此类似:使用 notifyItemRemoveed 或 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个答案

    云文栋
    2023-03-14

    好的,让我们解释一些基本的东西。

    >

  • 首先,通知DataSetChanged()从适配器列表中刷新完整的RV布局,杀死所有动画。我们不希望这样。创建RV也是为了节省电池,如果我们一直调用这个方法,我们就做不好。

    要删除一个项目,您可以将其从列表(ArrayList)中删除,并在调用通知项删除(您刚刚删除的项目的索引)之后。执行动画。无需调用通知项更改()!这样做将触发该位置项目的新绑定。

    不要使用getLayoutPosition()它将表示布局中的位置,而不是列表在适配器中的位置。要知道实际位置,必须调用getAdapterPosition()

    不要在绑定中调用holder.getAdapterPosition(),你已经有了位置

    现在,您不需要为每个项目重新发明一个新的适配器,所以,考虑采用这个库FlexibleAdapter,因为它将处理所有开箱即用的基本功能(您不需要扩展它);您可以为您需要的每种视图类型自定义项目;视图持有者是预定义的:公共事件已经实现(单击和长时间单击);它保持旋转后的状态等等...

  • 蔚桐
    2023-03-14

    试试看:

      adapter.remove(item);
      adapter.notifyItemRemoved(position);
      adapter.notifyItemRangeChanged(position, list.count());
    
     类似资料:
    • 我正在创建一个使用RecyclerView显示的卡片列表,其中每个卡片都有一个按钮,可以从列表中删除该卡片。 是否有人有使用notifyItemRemoved()的经验,并且知道它的行为与NotifyDataSetChanged不同的原因? 下面是我正在使用的一些代码:

    • 我正在用AppWidgetHostViews填充RecyclerView。它们被排序一个比一个低,每个都有删除按钮旁边。这就是我如何设置RecyclerView和适配器(Event.Object是AppWidgetHostView): 这是保存AppWidgetHostViews的适配器: 因此它再次为适配器设置数据并通知数据集已更改。 但问题是,当我单击“删除”按钮时,项目没有被正确删除。Vie

    • 我正在使用notify datasetchanged,我可以解决这个问题吗?

    • 当试图从Eclipse Oxygen中删除一个项目时,什么也没有发生,日志中会写入一个异常。我只需在包浏览器中右键单击一个项目,然后选择“删除”选项。我用的是Eclipse Oxygen.1a (4.7.1a)。以下是完整的构建信息: 下面是一个堆栈跟踪示例: 任何想法如何解决这个问题?或任何解决方法?

    • 问题内容: 我很难从OneToMany协会中删除孩子。我的实体: 我删除孩子的尝试失败: 这可行,但是我认为那不是正确的方法: 我在这里做错了什么? 由于 强尼 问题答案: 关联是双向的,并且双向关联的拥有方是没有mappedBy属性的一方。这意味着在这种情况下,拥有方是项目方。 Hibernate仅考虑拥有方知道关联是否存在。这意味着要破坏人员与项目之间的关联,必须将人员设置为项目中的。

    • 问题内容: 我有一个正在使用的。我以前用过但从未遇到过这个问题。 当我上下滚动时,某些项目消失,而某些消失的项目再次出现在底部。 码: : : 问题答案: 重用Views,因此可以说是第一次调用is 。这将导致该行的可见度为。 当又被称为绑定一个新行,该行的观点依然是-没有什么是复位之间势必行。 因此,您的if语句应完全重置状态: 这将确保正确设置每一行的可见性。