以编程方式将新项目添加到recyclerview吗?


113

我仍在努力让自己了解recyclerview。我有一个arraylist,可用于初始化回收站视图。

如何设置适配器和layoutmanager的新项目添加到回收视图中?

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添加新项目?


您可以在Github Happy代码中看到此示例!!!
Cabezas

Answers:


270

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

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

此方法比使用以下方法更好:

mAdapter.notifyDataSetChanged();

在性能上。


10
好答案。这也意味着它不会破坏动画
Ben Pearson

7
这应该被认为是正确的答案,另外一个则破坏了动画效果,并且效率不高。
Massimo 2015年

26
我是回答已接受答案的人,我认为这应该是已接受的答案:D
Abdelrahman Elkady 2015年

2
@AJW是的。mItems的最后一个元素的索引是mItems.size()-1。
Mostafa

2
谢谢!我有应从Internet上的onBindViewHolder加载的图像。每次接收数据时,我都需要追加到列表中并称为notifyDataSetChanged()。但这产生了图像闪烁效果。以上是我正在寻找的正确解决方案。您还可以使用mAdapter.notifyItemRangeInserted(mItems.size()-1,new_array_of_items_to_be_added.size());
Vignesh Bala

37

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

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

addItem("New Item");

2
如果不是我要添加的字符串,而是ViewGroup,该怎么办?
IgorGanapolsky

1
@IgorGanapolsky我也有同样的疑问。您是否找到了解决方案?
Sash_KP 2015年

这里也有同样的疑问!有什么帮助吗?
Srujan Barai

5
@IgorGanapolsky该项目类型将由您的适配器指定,因此它实际上可以是任何对象。但是请记住,您添加的项目只是数据。RecyclerView内置了用于放大和绑定视图的函数,当您notifyDataSetChanged()时将发生这种情况。您可以调试onBindViewHolder来查看正在编辑的视图。
克里斯(Chris)

1
@IgorGanapolsky您ArrayList<T>将不得不使用要添加的对象类型,例如ArrayList<ViewGroup>而不是ArrayList<String>。然后,您可以将参数类型从更改StringViewGroup。(对不起,死灵)。
埃里克·里德

14

如果要将多个项目添加到列表,请使用以下命令:

mAdapter.notifyItemRangeInserted(startPosition, itemcount);

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

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.