提问者:小点点

如何更新RecyclerView适配器数据?


试图弄清楚更新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个答案

    匿名用户

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

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

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

    这几行代码对我有用。

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

    mAdapter.notifyDataSetChanged();
    

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