2015-01-08 18 views
61

Sto ancora cercando di capire come riciclare il panorama. Ho un arraylist, che uso per inizializzare una vista del riciclatore con.Aggiungi un nuovo elemento a recyclerview a livello di programmazione?

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, in pratica dopo che ho initdata() e initRecyclerView(), Come faccio ad aggiungere un nuovo elemento alla RecyclerView ??

+0

Si può vedere [questo esempio a Github] (https://github.com/CabezasGonzalezJavier/FullRecycleView/tree/master/app/src/main/java/com/thedeveloperworldisyours/fullrecycleview/ verticale) Codice felice !!! – Cabezas

risposta

176

innanzitutto aggiungere il vostro articolo per mItems e quindi usare:

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

che è meglio di utilizzando:

mAdapter.notifyDataSetChanged(); 

in prestazioni.

+9

Buona risposta. Significa anche che non interromperà le animazioni –

+7

Questo dovrebbe essere accettato come risposta corretta, l'altro rompe le animazioni ed è meno efficiente di questo. – Massimo

+20

Io sono quello che ha risposto alla risposta accettata e penso che questo dovrebbe essere accettato: D –

25

semplicemente aggiungere alla vostra struttura dati (mItems), e quindi notificare l'adattatore per il cambiamento di dati

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

addItem("New Item"); 
+2

Cosa succede se non è una stringa che voglio aggiungere, ma un ViewGroup? –

+1

@IgorGanapolsky Ho anche lo stesso dubbio. Hai trovato qualche soluzione per questo? –

+0

stesso dubbio anche qui! qualsiasi aiuto? –

6

se si sta aggiungendo più elementi per l'utilizzo lista questo:

mAdapter.notifyItemRangeInserted(startPosition, itemcount); 

Questo notificare eventuali osservatori registrati che gli elementi ItemCount attualmente riflesse a partire da positionStart sono state recentemente inserite. L'articolo precedentemente posizionato in positionStart e oltre può ora essere trovato a partire da posizione positinStart + itemCount

elemento esistente nel set di dati ancora considerato aggiornato.

-2

this.runOnUiThread(new Runnable() { 
    public void run() { 
     mAdapter.notifyDataChanged() 
    } 
});