Aggiungere un nuovo elemento a recyclerview a livello di codice?


114

Sto ancora cercando di capire come funziona Recyclerview. Ho un arraylist, che uso per inizializzare una vista riciclatore con.

Come posso aggiungere nuovi elementi al post di visualizzazione del riciclatore impostando un adattatore e un 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);
        }
    }

Quindi fondamentalmente dopo io initdata()e initRecyclerView(), come aggiungo un nuovo elemento a RecyclerView ??


Puoi vedere questo esempio nel codice Github Happy !!!
Cabezas

Risposte:


272

Prima aggiungi il tuo articolo mItemse poi usa:

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

questo metodo è migliore rispetto all'utilizzo di:

mAdapter.notifyDataSetChanged();

nelle prestazioni.


11
Buona risposta. Significa anche che non interromperà le animazioni
Ben Pearson

7
Questa dovrebbe essere accettata come risposta giusta, l'altra interrompe le animazioni ed è meno efficiente di questa.
Massimo

27
Sono quello che ha risposto alla risposta accettata e penso che questa dovrebbe essere quella accettata: D
Abdelrahman Elkady

2
@AJW sì. l'indice dell'ultimo elemento di mItems è mItems.size () - 1.
Mostafa

2
Grazie! Ho immagini che dovrebbero essere caricate da Internet in onBindViewHolder. Ogni volta che ricevo dati, devo aggiungerli all'elenco e chiamare notifyDataSetChanged (). Ma questo ha prodotto un effetto tremolante dell'immagine. Sopra era la soluzione giusta che stavo cercando. Puoi anche utilizzare mAdapter.notifyItemRangeInserted (mItems.size () - 1, new_array_of_items_to_be_added.size ());
Vignesh Bala

38

aggiungi semplicemente alla tua struttura dati (mItems), quindi notifica all'adattatore la modifica del set di dati

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

addItem("New Item");

2
E se non fosse una stringa che voglio aggiungere, ma un ViewGroup?
IgorGanapolsky

1
@IgorGanapolsky Anch'io ho lo stesso dubbio. Hai trovato una soluzione per questo?
Sash_KP

stesso dubbio anche qui! qualsiasi aiuto?
Srujan Barai

5
@IgorGanapolsky Il tipo di elemento sarebbe specificato dal tuo adattatore, quindi potrebbe essere davvero qualsiasi oggetto. Ma tieni presente che l'elemento che aggiungi dovrebbero essere solo i dati. RecyclerView ha funzioni integrate per gonfiare e associare una vista, che è ciò che accadrà quando si notificaDataSetChanged (). È possibile eseguire il debug di onBindViewHolder per vedere la visualizzazione modificata.
Chris

1
@IgorGanapolsky Dovresti ArrayList<T>usare il tipo di oggetto che vuoi aggiungere, ad esempio ArrayList<ViewGroup>invece di ArrayList<String>. Quindi puoi semplicemente cambiare il tipo di argomento da Stringa ViewGroup. (Ci scusiamo per il necro).
Eric Reed

14

se stai aggiungendo più elementi all'elenco, usa questo:

mAdapter.notifyItemRangeInserted(startPosition, itemcount);

Questo notifica a tutti gli osservatori registrati che gli elementi itemCount attualmente riflessi a partire da positionStart sono stati nuovamente inseriti. L'elemento precedentemente posizionato in positionStart e oltre può ora essere trovato a partire dalla posizione positinStart + itemCount

elemento esistente nel set di dati ancora considerato aggiornato.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.