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

如何更新RecyclerView适配器数据?

吴俊风
2023-03-14

试图弄清楚更新recyclerView的适配器有什么问题。

在我得到一个新的产品列表后,我尝试:

>

  • 从创建RecyclerView的片段中更新ArrayList,将新数据设置到adapter,然后调用adapter.NotifyDataSetChanged();但没有奏效。

    像其他人一样创建一个新适配器,它对他们有效,但对我没有任何改变:recyclerview.setadapter(new RecyclerViewAdapter(newArrayList))

    adapter中创建一个更新数据的方法,如下所示:

    public void updateData(ArrayList<ViewModel> viewModels) {
       items.clear();
       items.addAll(viewModels);
       notifyDataSetChanged();
    }
    

    然后每当我想要更新数据列表时,我就调用这个方法;但没有奏效。

    检查是否可以以任何方式修改recyclerView,并且我尝试至少删除一个项目:

     public void removeItem(int position) {
        items.remove(position);
        notifyItemRemoved(position);
    }
    

    一切都保持原样。

    这是我的适配器:

    public class RecyclerViewAdapter extends RecyclerView.Adapter<RecyclerViewAdapter.ViewHolder> implements View.OnClickListener {
    
        private ArrayList<ViewModel> items;
        private OnItemClickListener onItemClickListener;
    
        public RecyclerViewAdapter(ArrayList<ViewModel> items) {
            this.items = items;
        }
    
    
        public void setOnItemClickListener(OnItemClickListener onItemClickListener) {
            this.onItemClickListener = onItemClickListener;
        }
    
        @Override
        public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
            View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_recycler, parent, false);
            v.setOnClickListener(this);
            return new ViewHolder(v);
        }
    
        public void updateData(ArrayList<ViewModel> viewModels) {
            items.clear();
            items.addAll(viewModels);
            notifyDataSetChanged();
        }
        public void addItem(int position, ViewModel viewModel) {
            items.add(position, viewModel);
            notifyItemInserted(position);
        }
    
        public void removeItem(int position) {
            items.remove(position);
            notifyItemRemoved(position);
        }
    
    
    
        @Override
        public void onBindViewHolder(ViewHolder holder, int position) {
            ViewModel item = items.get(position);
            holder.title.setText(item.getTitle());
            Picasso.with(holder.image.getContext()).load(item.getImage()).into(holder.image);
            holder.price.setText(item.getPrice());
            holder.credit.setText(item.getCredit());
            holder.description.setText(item.getDescription());
    
            holder.itemView.setTag(item);
        }
    
        @Override
        public int getItemCount() {
            return items.size();
        }
    
        @Override
        public void onClick(final View v) {
            // Give some time to the ripple to finish the effect
            if (onItemClickListener != null) {
                new Handler().postDelayed(new Runnable() {
                    @Override
                    public void run() {
                        onItemClickListener.onItemClick(v, (ViewModel) v.getTag());
                    }
                }, 0);
            }
        }
    
        protected static class ViewHolder extends RecyclerView.ViewHolder {
            public ImageView image;
            public TextView price, credit, title, description;
    
            public ViewHolder(View itemView) {
                super(itemView);
                image = (ImageView) itemView.findViewById(R.id.image);
                price = (TextView) itemView.findViewById(R.id.price);
                credit = (TextView) itemView.findViewById(R.id.credit);
                title = (TextView) itemView.findViewById(R.id.title);
                description = (TextView) itemView.findViewById(R.id.description);
            }
        }
    
        public interface OnItemClickListener {
    
            void onItemClick(View view, ViewModel viewModel);
    
        }
    }
    

    并启动recyclerview,如下所示:

    recyclerView = (RecyclerView) view.findViewById(R.id.recycler);
    recyclerView.setLayoutManager(new GridLayoutManager(getActivity(), 5));
    adapter = new RecyclerViewAdapter(items);
    adapter.setOnItemClickListener(this);
    recyclerView.setAdapter(adapter);
    

    那么,我实际上如何更新适配器数据以便显示新接收的项目呢?

    更新:问题是gridView的布局如下所示:

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:orientation="vertical"
        android:layout_width="match_parent"
        android:tag="catalog_fragment"
        android:layout_height="match_parent">
    
        <FrameLayout
            android:orientation="vertical"
            android:layout_width="match_parent"
            android:layout_height="match_parent">
    
            <android.support.v7.widget.RecyclerView
                android:id="@+id/recycler"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:clipToPadding="false"/>
    
            <ImageButton
                android:id="@+id/fab"
                android:layout_gravity="top|end"
                style="@style/FabStyle"/>
    
        </FrameLayout>
    </LinearLayout>
    

    然后我只是删除了linearlayout并将frameLayout作为父布局。

  • 共有1个答案

    凌照
    2023-03-14

    我正在使用RecyclerView,删除和更新都工作得很好。

    1)删除:从RecyclerView中删除项目有4个步骤

    list.remove(position);
    recycler.removeViewAt(position);
    mAdapter.notifyItemRemoved(position);                 
    mAdapter.notifyItemRangeChanged(position, list.size());
    

    这几行代码对我有用。

    2)更新数据:我要做的唯一事情是

    mAdapter.notifyDataSetChanged();
    

    您必须在ActVity/Fragment代码中完成所有这些操作,而不是在RecyclerView适配器代码中。

     类似资料:
    • > 从创建的片段中更新,将新数据设置为adapter,然后调用;但没有奏效。 像其他人一样创建一个新适配器,它对他们起作用,但对我没有任何改变: 在中创建一个更新数据的方法,如下所示: 问题是gridView的布局如下所示: 然后我只是删除了并将作为父布局。

    • 当我必须使用带有ListView的经典适配器时,我会像这样更新ListView中的数据: 我想知道什么是RecyclerView的最佳实践。因为在RecyclerView适配器中不能像在ListView中那样执行和。 所以我尝试使用,但没有效果。然后我尝试在视图上使用swapAdapter: 但是对于最后一个解决方案,我仍然必须创建一个适配器的新实例,我觉得这不是最好的解决方案。我应该可以在不使用

    • 我正在创建聊天应用程序,我想每秒刷新一次数据,但问题是recyclerview scroll重置了它们的第一个位置。如何摆脱这个。提前感谢:) 我使用MySql sserver添加和获取数据。

    • 我在线程池中有一个进程列表,我在recycler视图的每个项目中显示进程的进度,我需要刷新适配器以显示队列中的新进程处理,但我唯一能做的就是转到另一个视图并返回。 我如何刷新适配器来实时查看一个进程如何结束和另一个进程如何开始,而不需要转到另一个视图并返回到适配器视图。 这是我的回收站视图适配器类的内部线程,它负责更新进度条。

    • 在我的主要活动中,我有三个循环利用的观点。 其中一个在底部工作表中,它是主要的(默认情况下,底部工作表是打开以显示这个),在其适配器的onbind方法中,我做了一个onClickListener,以便当用户单击其中的项目时,我想要, 我想回到主活动类来设置To Start一个方法,它的滚动是关闭底表并为下一个回收视图设置数据(当底表关闭时会出现) ......这里的问题是如何从onBind方法的L

    • 一切正常。但Logcat中显示了一些错误。 E/RecyclerView:未附加适配器;跳过布局 E/RecyclerView:未附加适配器;跳过布局 我的activity代码: 我读过与同一问题有关的其他问题,但都没有帮助。请帮帮我