2017-10-02 8 views
0

Ich verwende eine Recycler-Ansicht, in der einige Elemente mit komplexen benutzerdefinierten Komponenten geladen werden. Es braucht Zeiten zu laden und das Problem ist die Recycler View Aufruf wann immer notwendig die Methode "onBindViewHolder" (während Scroll etc), um die Ansichten neu zu erstellen und es braucht Zeit wieder zu regenerieren alle Elemente (ich spreche nicht über das XML des Elements Layout). Und so ... nicht sehr cool für die Leistung.RecyclerView vermeiden, Artikel neu zu laden?

Wie vermeide ich die Neuerstellung eines Artikels?

Ich versuchte zu rufen:

setIsRecyclable 

Aber es funktioniert nicht.

Beispiel:

public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { 
    // CODE 1 : treatments applied to the item view 
    // the problem is here, I don't want to repeat this code when it's already done 
} 
+0

haben Sie Ihren ViewHolder oder nicht in Ihrem Adapter? –

+0

Ye yep, ich habe eine Ansicht Inhaber etc .... – deveLost

+0

können Sie einen Code schreiben? – Benjamin

Antwort

0
final Handler timerHandler; 
    timerHandler = new Handler(); 

    Runnable timerRunnable = new Runnable() { 
     @Override 
     public void run() { // Here you can update your adapter data 

      mRecyclerView.invalidate(); 


      My_function(); 

      // mRecyclerView.scrollToPosition(mRecyclerView.getAdapter().getItemCount() - 1); 

      //mAdapter.notifyDataSetChanged(); 
      timerHandler.postDelayed(this, 3000); 
      //Toast.makeText(Chat_Activity.this, "Refreace", Toast.LENGTH_SHORT).show(); 
     } 
    }; 
    timerHandler.postDelayed(timerRunnable, 3000); 
+0

Ja, ich kann die Arbeit in einem anderen Thread erledigen; aber das Problem ist immer noch das gleiche. Wie in OnBindViewHolder zu vermeiden, um eine Arbeit bereits getan haben? – deveLost

+0

ya.aber dann verwenden Aktivität oder Fragment ... das funktioniert –

0

in Ihrem onBindViewHolder Asynctask erzeugen und in doInBackground tun, um Ihre Inhalte Einstellungsprozess.

0

Warum nicht ein hashmap, wo Sie einen Booleschen Wert speichern, um anzuzeigen, wenn Sie den Betrieb an der Position durchgeführt haben?

HashMap<Integer,boolean> operations = new HashMap<>(); 

public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { 
     if(operations.contains(position){ 
     //Do nothing.. 
     } 
     else 
     { 
     //Do operations... 
     operations.put(position,true); 
     } 
} 
+0

Ja dachte ich über eine einfache Lösung, aber .... hatte Android keine Pläne für solch einen einfachen Fall ?! – deveLost