How do I refresh a recyclerview in android?

雨燕双飞 提交于 2019-12-14 04:23:47

问题


I am populating the recycler view with new data on Activity result.The problem is the new data is getting append at the end of the recycler view how do I clear the previous data in the recycler view and inflate the recycler view with the new data.

@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();


        }
    }
}

This is the code for 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;



}

This is my code for 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;

}

And this is my DataAdapter code.

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);
        }
    }

}

Any help or suggestion is appreciated.Thank you.


回答1:


Notify your adapter to reflect the changes

mAdapter.notifyDataSetChanged();



回答2:


clear your array list before adding object into:

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;
            }



回答3:


Call this method

removeAllViews() on your recycler before setting a new Adapter.




回答4:


Just clean your adapter's data, add new data to it and then call notifyDataSetChanged() on your adapter:

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


来源:https://stackoverflow.com/questions/43893288/how-do-i-refresh-a-recyclerview-in-android

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!