以编程方式向 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<T>
必须使用您要添加的对象类型,例如ArrayList<ViewGroup>
而不是 ArrayList<String>
。然后您可以将参数类型从String
更改为ViewGroup
。 (对不起,死灵)。【参考方案3】:
如果您要向列表中添加多个项目,请使用:
mAdapter.notifyItemRangeInserted(startPosition, itemcount);
这会通知所有已注册的观察者,当前反映的 itemCount 项目从 positionStart 开始已被新插入。以前位于 positionStart 及以后的项目现在可以从位置 positinStart+itemCount 开始找到
数据集中的现有项目仍被认为是最新的。
【讨论】:
以上是关于以编程方式向 recyclerview 添加新项目?的主要内容,如果未能解决你的问题,请参考以下文章
以编程方式添加视图与使用 recyclerView 有啥区别?
RecyclerView 与以编程方式创建的视图:哪个更好?
在recyclerview android中以编程方式更改布局管理器