以编程方式向 recyclerview 添加新项目?

Posted

技术标签:

【中文标题】以编程方式向 recyclerview 添加新项目?【英文标题】:Add a new item to recyclerview programmatically? 【发布时间】:2015-03-06 20:37:40 【问题描述】:

我仍在努力了解 recyclerview。 我有一个数组列表,我用它来初始化回收站视图。

如何在设置适配器和布局管理器后向回收站视图添加新项目?

private void initData() 
        mItems = new ArrayList<String>();
        for (int i = 0; i < ITEMS_COUNT; i++) 
            mItems.add("Item " + (i + 1));
        
    

    private void initRecyclerView() 
        mRecentRecyclerView = (RecyclerView) findViewById(R.id.recentrecyclerView);
        mRecentRecyclerView.setHasFixedSize(true);
        mRecentLayoutManager = new LinearLayoutManager(this);
        mRecentRecyclerView.setLayoutManager(mRecentLayoutManager);



        mAdapter = new RecyclerView.Adapter<CustomViewHolder>() 
            @Override
            public CustomViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) 
                View view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.notice_snippet
                        , viewGroup, false);
                return new CustomViewHolder(view);
            

            @Override
            public void onBindViewHolder(CustomViewHolder viewHolder, int i) 
                viewHolder.noticeSubject.setText(mItems.get(i));
            

            @Override
            public int getItemCount() 
                return mItems.size();
            

        ;
        mRecentRecyclerView.setAdapter(mAdapter);

    private class CustomViewHolder extends RecyclerView.ViewHolder 

        private TextView noticeSubject;

        public CustomViewHolder(View itemView) 
            super(itemView);

            noticeSubject = (TextView) itemView.findViewById(R.id.notice_subject);
        
    

所以基本上在我initdata()initRecyclerView() 之后,我如何向 RecyclerView 添加一个新项目??

【问题讨论】:

可以看到this example in Github快乐码!!! 【参考方案1】:

首先将您的项目添加到mItems,然后使用:

mAdapter.notifyItemInserted(mItems.size() - 1);

这种方法比使用更好:

mAdapter.notifyDataSetChanged();

在性能方面。

【讨论】:

好答案。这也意味着它不会破坏动画 这应该被接受为正确答案,另一个破坏动画并且效率低于这个。 我是回答公认答案的人,我认为这应该是公认的答案:D @AJW 是的。 mItems 的最后一个元素的索引是 mItems.size()-1。 谢谢!我在 onBindViewHolder 中有应该从 Internet 加载的图像。每次收到数据时,我都需要追加到列表中并调用 notifyDataSetChanged()。但这产生了图像闪烁的效果。以上是我正在寻找的正确解决方案。你也可以使用 mAdapter.notifyItemRangeInserted(mItems.size() - 1, new_array_of_items_to_be_added.size());【参考方案2】:

只需添加到您的数据结构 (mItems),然后通知您的适配器有关数据集的更改

private void addItem(String item) 
  mItems.add(item);
  mAdapter.notifyDataSetChanged();


addItem("New Item");

【讨论】:

如果我想添加的不是字符串而是 ViewGroup 怎么办? @IgorGanapolsky 我也有同样的疑问。你找到解决办法了吗? 这里也有同样的疑问!有什么帮助吗? @IgorGanapolsky 项目类型将由您的适配器指定,因此它实际上可以是任何对象。但请记住,您添加的项目应该是数据。 RecyclerView 内置了用于膨胀和绑定视图的函数,这就是当您 notifyDataSetChanged() 时会发生的事情。您可以调试 onBindViewHolder 以查看正在编辑的视图。 @IgorGanapolsky 您的ArrayList&lt;T&gt; 必须使用您要添加的对象类型,例如ArrayList&lt;ViewGroup&gt; 而不是 ArrayList&lt;String&gt;。然后您可以将参数类型从String 更改为ViewGroup。 (对不起,死灵)。【参考方案3】:

如果您要向列表中添加多个项目,请使用:

mAdapter.notifyItemRangeInserted(startPosition, itemcount);

这会通知所有已注册的观察者,当前反映的 itemCount 项目从 positionStart 开始已被新插入。以前位于 positionStart 及以后的项目现在可以从位置 positinStart+itemCount 开始找到

数据集中的现有项目仍被认为是最新的。

【讨论】:

以上是关于以编程方式向 recyclerview 添加新项目?的主要内容,如果未能解决你的问题,请参考以下文章

以编程方式添加视图与使用 recyclerView 有啥区别?

RecyclerView 与以编程方式创建的视图:哪个更好?

删除相应项目时以编程方式删除 App Widget

在recyclerview android中以编程方式更改布局管理器

如何向在 tabcontroller 中以编程方式创建的导航控制器中的 barbuttonitem 添加操作

以编程方式将项目添加到 UIToolbar 不起作用