【问题标题】:How do I refresh a recyclerview in android?如何在android中刷新recyclerview?
【发布时间】:2017-05-10 13:00:59
【问题描述】:

我正在使用 Activity 的新数据填充回收站视图 结果。问题是新数据在末尾追加 回收站视图如何清除回收站视图中的先前数据 并使用新数据扩充回收站视图。

@Override
protected void onActivityResult(int requestCode, int resultCode, final Intent data) {
    super.onActivityResult(requestCode, resultCode, data);

    mAdapter.notifyDataSetChanged();
    search_info.clear();
    book_type.clear();


    if (requestCode == 1) {
        if (resultCode == RESULT_OK) {


            getBookData(data);


            if (books_list.size() > 0) {

                books_list.clear();
                mAdapter.swap(prepareData());
                mAdapter.notifyDataSetChanged();

            }
            updateBooks(recyclerView);
            mAdapter.notifyDataSetChanged();


        }
    }
}

这是 getBookData 的代码。

private void getBookData(Intent data) {
    String singles = data.getStringExtra("singles");
    String status_5in1series = data.getStringExtra("status_5in1series");
    String special_issues = data.getStringExtra("special_issues");
    String special_collection = data.getStringExtra("special_collection");
    String status_3in1series = data.getStringExtra("status_3in1series");
    String status_2in1 = data.getStringExtra("status_2in1");
    String special_packs = data.getStringExtra("special_packs");
    String junior = data.getStringExtra("junior");
    String character_collections = data.getStringExtra("character_collections");
    String single_digest = data.getStringExtra("single_digest");
    String double_digest = data.getStringExtra("double_digest");
    String toddler = data.getStringExtra("toddler");
    String tinkle_treasure = data.getStringExtra("tinkle_treasure");
    String ack = data.getStringExtra("ack");
    String tinkle = data.getStringExtra("tinkle");

    search_info.add(singles);
    search_info.add(status_5in1series);
    search_info.add(special_issues);
    search_info.add(special_collection);
    search_info.add(status_3in1series);
    search_info.add(status_2in1);
    search_info.add(special_packs);
    search_info.add(junior);
    search_info.add(character_collections);
    search_info.add(single_digest);
    search_info.add(double_digest);
    search_info.add(toddler);
    search_info.add(tinkle_treasure);
    search_info.removeAll(Collections.singleton(null));

    book_type.add(ack);
    book_type.add(tinkle);
    book_type.removeAll(Collections.singleton(null));


    String search_array[] = (String[]) search_info.toArray(new String[search_info.size()]);
    String books_array[] = (String[]) book_type.toArray(new String[book_type.size()]);


    String books_info = dbHandler.searchForBooks(search_array, books_array).toString();
    ParseLocBooks parseLocBooks = new ParseLocBooks(books_info);
    parseLocBooks.parseJSON();

    title = ParseLocBooks.title;
    price = ParseLocBooks.price;
    vol_no = ParseLocBooks.vol_no;
    status = ParseLocBooks.status;
    ISBN = ParseLocBooks.ISBN;
    book_id = ParseLocBooks.book_id;
    brand = ParseLocBooks.brand;
    book_code = ParseLocBooks.book_code;
    sku = ParseLocBooks.sku;
    lang = ParseLocBooks.lang;



}

这是我的 prepareData 代码。

 private ArrayList prepareData() {

for (int i = 0; i < book_id.length; i++) {
    BooksInfo booksInfo = new BooksInfo();
    booksInfo.setTitle(title[i]);
    booksInfo.setPrice(price[i]);
    booksInfo.setVol_no(vol_no[i]);
    booksInfo.setStatus(status[i]);
    booksInfo.setISBN(ISBN[i]);
    booksInfo.setBook_id(book_id[i]);
    booksInfo.setBrand(brand[i]);
    booksInfo.setBook_code(book_code[i]);
    booksInfo.setSku(sku[i]);
    booksInfo.setLang(lang[i]);
    books_list.add(booksInfo);

}


return books_list;

}

这是我的 DataAdapter 代码。

public class DataAdapter extends RecyclerView.Adapter<DataAdapter.ViewHolder>  {
    private ArrayList<BooksInfo> books;
    private Context ctx;
    private String qty;

    private RecyclerView recyclerView;
    public DataAdapter()
    {

    }
    @NonNull
    public OnItemCheckListener onItemCheckListener;

    public DataAdapter(Context context, ArrayList<BooksInfo> books, RecyclerView recyclerView,String qty, OnItemCheckListener onItemCheckListener) {
        this.books = books;
        this.ctx = context;
        this.qty = qty;
        this.onItemCheckListener =onItemCheckListener;
        this.recyclerView = recyclerView;

    }

   public interface OnItemCheckListener {
        void onItemCheck(BooksInfo item,ViewHolder viewHolder);
        void onItemUncheck(BooksInfo item,ViewHolder viewHolder);
    }

    public void swap(ArrayList<BooksInfo> datas){
        datas = new ArrayList<>();
        recyclerView.removeAllViews();
        books.clear();
        books.addAll(datas);
        notifyDataSetChanged();

    }

    @Override
    public DataAdapter.ViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
        View view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.card_row, viewGroup, false);
        return new ViewHolder(view);
    }

    @Override
    public void onBindViewHolder(final DataAdapter.ViewHolder viewHolder, int i) {



        final BooksInfo booksInfo = (BooksInfo) books.get(i);

        viewHolder.tv_title.setText(booksInfo.getTitle());
        viewHolder.tv_price.setText(booksInfo.getPrice());
        viewHolder.tv_vol_no.setText(booksInfo.getVol_no());
        viewHolder.tv_status.setText(booksInfo.getStatus());
        viewHolder.tv_isbn.setText(booksInfo.getISBN());
        viewHolder.tv_book_id.setText(booksInfo.getBook_id());
        viewHolder.tv_brand.setText(booksInfo.getBrand());
        viewHolder.tv_sku.setText(booksInfo.getSku());

        viewHolder.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                viewHolder.cb_selection.setChecked(!(viewHolder.cb_selection.isChecked()));
                if (viewHolder.cb_selection.isChecked()){
                    onItemCheckListener.onItemCheck(booksInfo,viewHolder);
//                    viewHolder.tv_qty.setText(qty);
                }else{
                    onItemCheckListener.onItemUncheck(booksInfo,viewHolder);
//                    viewHolder.tv_qty.setText("0");
                }

            }
        });


    }

    public void updateNotes(ArrayList notesList) {
        books = notesList;
    }


    public void updateQty(String q)
    {
        qty =q;

    }

    @Override
    public int getItemCount() {
        return books.size();
    }




    public class ViewHolder extends RecyclerView.ViewHolder{
        public TextView tv_title,tv_price,tv_vol_no,tv_status,tv_isbn,tv_book_id,tv_brand,tv_sku,tv_qty;
        public CheckBox cb_selection;
        View itemView;
        public ViewHolder(View itemView) {
            super(itemView);
            this.itemView = itemView;

            tv_title = (TextView)itemView.findViewById(R.id.tv_title);
            tv_price = (TextView) itemView.findViewById(R.id.tv_price);
            tv_vol_no = (TextView) itemView.findViewById(R.id.tv_volno);
            tv_status = (TextView) itemView.findViewById(R.id.tv_status);
            tv_isbn = (TextView) itemView.findViewById(R.id.tv_isbn);
            tv_book_id = (TextView) itemView.findViewById(R.id.tv_bookid);
            tv_brand = (TextView) itemView.findViewById(R.id.tv_brand);
            cb_selection = (CheckBox) itemView.findViewById(R.id.cb_selection);
            cb_selection.setClickable(false);
            tv_sku = (TextView) itemView.findViewById(R.id.tv_sku);
            tv_qty = (TextView) itemView.findViewById(R.id.tv_qty);
        }

        public void setOnClickListener(View.OnClickListener onClickListener) {
            itemView.setOnClickListener(onClickListener);
        }
    }

}

感谢任何帮助或建议。谢谢。

【问题讨论】:

  • 您在哪里创建了您的 books_list 对象?
  • @Sandeepdhiman 请检查我帖子末尾的 prepareData 方法。谢谢。

标签: java android android-recyclerview android-arrayadapter


【解决方案1】:

通知您的适配器以反映更改

mAdapter.notifyDataSetChanged();

【讨论】:

    【解决方案2】:

    在将对象添加到之前清除您的数组列表:

    private ArrayList prepareData() {
                    books_list.clear();
                    for (int i = 0; i < book_id.length; i++) {
                        BooksInfo booksInfo = new BooksInfo();
                        booksInfo.setTitle(title[i]);
                        booksInfo.setPrice(price[i]);
                        booksInfo.setVol_no(vol_no[i]);
                        booksInfo.setStatus(status[i]);
                        booksInfo.setISBN(ISBN[i]);
                        booksInfo.setBook_id(book_id[i]);
                        booksInfo.setBrand(brand[i]);
                        booksInfo.setBook_code(book_code[i]);
                        booksInfo.setSku(sku[i]);
                        booksInfo.setLang(lang[i]);
                        books_list.add(booksInfo);            
                    }                      
                    return books_list;
                }
    

    【讨论】:

    • 谢谢@vivekmahajan 我试过了,但它对我不起作用。
    【解决方案3】:

    调用这个方法

    removeAllViews() 在你的回收站上设置一个新的适配器。

    【讨论】:

      【解决方案4】:

      只需清理适配器的数据,向其中添加新数据,然后在适配器上调用 notifyDataSetChanged()

      yourDataList.clear();
      yourDataList.addNewObjects();
      adapter.notifyDataSetChanged();
      

      【讨论】:

      • 嗨 bigO 我厌倦了用这个方法做这个 public void swap(ArrayList datas){ datas = new ArrayList(); book.clear();书籍.addAll(数据); notifyDataSetChanged(); } 但它对我不起作用。
      • @anup 您可以编辑您的问题并将您的完整代码发布到您尝试使用 notifyDataSetChanged() 的位置吗?让我看看可能出了什么问题。
      猜你喜欢
      • 2021-05-24
      • 1970-01-01
      • 1970-01-01
      • 2018-12-16
      • 2017-11-11
      • 2015-06-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多