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

Shu*_*dia 107 android items add android-recyclerview

我仍然试图了解Recyclerview.我有一个arraylist,我用它来初始化一个回收站视图.

如何在设置适配器和布局管理器的回收器视图中添加新项?

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);
        }
    }
Run Code Online (Sandbox Code Playgroud)

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

Mos*_*afa 250

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

mAdapter.notifyItemInserted(mItems.size() - 1);
Run Code Online (Sandbox Code Playgroud)

这种方法比使用方法更好:

mAdapter.notifyDataSetChanged();
Run Code Online (Sandbox Code Playgroud)

在表现.

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

Abd*_*ady 33

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

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

addItem("New Item");
Run Code Online (Sandbox Code Playgroud)

  • @IgorGanapolsky项目类型将由您的适配器指定,因此它可能是任何对象.但请记住,您添加的项目应该是数据.RecyclerView内置了用于膨胀和绑定视图的函数,这是notifyDataSetChanged()时会发生的情况.您可以调试onBindViewHolder以查看正在编辑的视图. (5认同)
  • 如果它不是我想添加的字符串,而是一个ViewGroup怎么办? (2认同)

Nit*_*and 11

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

mAdapter.notifyItemRangeInserted(startPosition, itemcount);
Run Code Online (Sandbox Code Playgroud)

这通知任何已注册的观察者已经新插入了从positionStart开始的当前反映的itemCount项目.之前位于positionStart及以后的项目现在可以从位置positinStart + itemCount开始找到

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