Tambahkan item baru ke recyclerview secara terprogram?

113

Saya masih mencoba untuk fokus pada recyclerview. Saya memiliki daftar larik, yang saya gunakan untuk menginisialisasi tampilan pendaur ulang.

Bagaimana saya bisa menambahkan item baru ke recycler view post mengatur adaptor dan layoutmanager?

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

Jadi pada dasarnya setelah I initdata()dan initRecyclerView(), bagaimana cara menambahkan item baru ke RecyclerView ??

Shubham Kanodia
sumber
Anda dapat melihat contoh ini di kode Github Happy !!!
Cabezas

Jawaban:

271

Pertama tambahkan item Anda ke mItemsdan kemudian gunakan:

mAdapter.notifyItemInserted(mItems.size() - 1);

metode ini lebih baik daripada menggunakan:

mAdapter.notifyDataSetChanged();

dalam performa.

Mostafa
sumber
11
Jawaban yang bagus. Ini juga berarti bahwa itu tidak akan merusak animasi
Ben Pearson
7
Ini harus diterima sebagai jawaban yang benar, yang lain merusak animasi dan kurang efisien dari yang ini.
Massimo
27
Akulah yang menjawab jawaban yang diterima dan saya pikir ini harus yang diterima: D
Abdelrahman Elkady
2
@AJW ya. indeks elemen terakhir mItems adalah mItems.size () - 1.
Mostafa
2
Terima kasih! Saya memiliki gambar yang harus dimuat dari internet di onBindViewHolder. Setiap kali saya menerima data, saya perlu menambahkan ke daftar dan memanggil notifyDataSetChanged (). Tapi ini membuat efek gambar berkedip-kedip. Di atas adalah solusi tepat yang saya cari. Anda juga dapat menggunakan mAdapter.notifyItemRangeInserted (mItems.size () - 1, new_array_of_items_to_be_added.size ());
Vignesh Bala
37

cukup tambahkan ke struktur data Anda (mItems), lalu beri tahu adaptor Anda tentang perubahan set data

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

addItem("New Item");
Abdelrahman Elkady
sumber
2
Bagaimana jika itu bukan string yang ingin saya tambahkan, tetapi ViewGroup?
IgorGanapolsky
1
@IgorGanapolsky Saya juga memiliki keraguan yang sama. Apakah Anda menemukan solusi untuk itu?
Sash_KP
keraguan yang sama di sini juga! ada bantuan?
Srujan Barai
5
@IgorGanapolsky Jenis item akan ditentukan oleh Adaptor Anda, jadi bisa berupa objek apa pun. Namun perlu diingat bahwa item yang Anda tambahkan seharusnya adalah data. RecyclerView memiliki fungsi bawaan untuk memekarkan dan mengikat tampilan, yang akan terjadi saat Anda notifyDataSetChanged (). Anda bisa men-debug onBindViewHolder untuk melihat tampilan yang sedang diedit.
Chris
1
@IgorGanapolsky Anda ArrayList<T>harus menggunakan jenis objek yang ingin Anda tambahkan, misalnya, ArrayList<ViewGroup>bukan ArrayList<String>. Kemudian Anda bisa mengubah tipe argumen dari Stringmenjadi ViewGroup. (Maaf untuk necro).
Eric Reed
14

jika Anda menambahkan beberapa item ke daftar gunakan ini:

mAdapter.notifyItemRangeInserted(startPosition, itemcount);

Ini memberi tahu setiap pengamat terdaftar bahwa item itemCount yang saat ini direfleksikan mulai dari positionStart baru saja dimasukkan. Item yang sebelumnya terletak di positionStart dan seterusnya sekarang dapat ditemukan mulai dari position positinStart + itemCount

item yang ada dalam dataset masih dianggap up to date.

Nitin Anand
sumber