2015-01-08 21 views
61

Ich versuche immer noch, meinen Kopf um Recyclerview zu bekommen. Ich habe eine Arraylist, mit der ich eine Recycleransicht initialisiere.Hinzufügen eines neuen Elements zu recyclerview programmgesteuert?

Wie kann ich dem Recycler-View-Post neue Elemente hinzufügen, indem ich einen Adapter und Layout-Manager einstelle?

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

Also im Grunde, nachdem ich initdata() und initRecyclerView(), wie kann ich ein neues Element der RecyclerView hinzufügen ??

+0

können Sie sehen [dieses Beispiel in Github] (https://github.com/CabezasGonzalezJavier/FullRecycleView/tree/master/app/src/main/java/com/thedeveloperworldisyours/fullrecycleview/ vertikal) Happy Code !!! – Cabezas

Antwort

176

Fügen Sie zunächst Ihren Artikel mItems und verwenden Sie dann mitteilen:

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

als besser als mit:

mAdapter.notifyDataSetChanged(); 

in der Leistung.

+9

Gute Antwort. Es bedeutet auch, dass es Animationen nicht brechen wird –

+7

Dies sollte als richtige Antwort akzeptiert werden, der andere bricht Animationen und ist weniger effizient als dieser. – Massimo

+20

Ich bin derjenige, der die akzeptierte Antwort beantwortet hat und ich denke, das sollte der akzeptierte sein: D –

25

einfach auf Ihre Datenstruktur (mItems) hinzufügen und dann den Adapter zu ändern Dataset

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

addItem("New Item"); 
+2

Was ist, wenn es keine Zeichenfolge ist, die ich hinzufügen möchte, sondern eine ViewGroup? –

+1

@IgorGanapolsky Ich habe auch die gleichen Zweifel. Haben Sie dafür eine Lösung gefunden? –

+0

gleichen Zweifel auch hier! irgendeine Hilfe? –

6

wenn Sie mehrere Elemente in die Liste Verwendung dieser hinzufügen:

mAdapter.notifyItemRangeInserted(startPosition, itemcount); 

Diese benachrichtigen alle registrierten Beobachter, dass die zur Zeit reflektiert ItemCount Artikel ab positionStart wurden neu eingeführt. Der zuvor bei positionStart und beyond befindliche Artikel kann nun ab der Position positinStart + itemCount

gefunden werden, die im aktuell noch vorhandenen Datensatz enthalten ist.

-2

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