2016-04-16 5 views
2

Ich arbeite an einem Android-Projekt, in dem es eine Recyclerview bestehend aus Elementen (Zeilen) geben wird. Zur Laufzeit wird jedes Element (Zeile) zur Recyclerview hinzugefügt, es beginnt mit dem Hochladen auf den Server und aktualisiert die Statusleiste in diesem Element (Zeile). Jedes Item hier ist eine Datei. Alles funktioniert gut, solange die Elemente bis zur Bildschirmgröße hinzugefügt werden. Immer wenn Elemente das Bildschirmlimit überschreiten, müsste ich scrollen. Während des Scrollens, Fortschrittsbalken aktualisieren auf verschiedenen Elementen. manchmal auf zwei oder mehr Gegenstände. Nachdem ich viel gegoogelt habe, habe ich verstanden, dass es wegen der Recyclerview bereits erstellte Viewholders wiederverwendet.Progressbar im Recyclerview

hier ist mein Adapter Code of recyclerview:

public class MyViewHolder extends RecyclerView.ViewHolder { 

    private TextView filename; 

    private ProgressBar file_progressbar; 

    public MyViewHolder(View v) { 

     super(v); 

     filename = (TextView) v.findViewById(R.id.filename); 

     file_progressbar = (ProgressBar) v.findViewById(R.id.file_progressbar); 

    } 

} 


    public void onBindViewHolder(final MyViewHolder holder, final int position) { 


    final String fname = fDataset.get((fDataset.size() - 1) - position); 

    File f = new File(fname); 

    holder.filename.setText(f.getName()); 
      if(internetchek.isNetworkAvailable(this.ctx)) 
      { 

       holder.file_progressbar.setVisibility(View.VISIBLE); 

       upload up = new upload(this.ctx,fname,holder.file_progressbar,"uploadstart"); 

       up.execute(); 
      } 
      else { 

       Toast.makeText(this.ctx, "Offline", Toast.LENGTH_LONG).show(); 

      } 


     } 

Ich habe Klasse übergeben holder.file_progressbar in Upload. Damit wird die Fortschrittsleiste in der Upload-Klasse aktualisiert. Ich habe keine Ahnung, wie ich dieses Problem lösen könnte. Vielen Dank im Voraus

Antwort

2

Versuchen hinzufügen separate Fahnen für Ihre Daten wie diese

private boolean isItemUpdating(int position) { 
    return mDataUpdatingFlags[position]; 
} 

private void setItemUpdating(int position, boolean isUpdating) { 
    mDataUpdatingFlags[position] = isUpdating; 
} 

Dann in Ihrem onBindViewHolder nennt diese Methode zum Einrichten Ihres Fortschritt richtig:

if (isItemUpdating(position) { 
    holder.showProgressBar(); 
} else { 
    holder.hideProgressBar(); 
} 
+0

Es ist nur ein Teil der Lösung das Problem. Immer wenn mehr als screan size Zeilen hochgeladen werden. Der Fortschrittsbalken einer Zeile wird für eine andere Zeilenaktualisierung umgekehrt angezeigt. – sandesh

+0

@sandesh, adressiert dieses Problem tatsächlich. Wenn die Anzahl der Recycler-Reihen groß genug ist, um eine Bildschirmhöhe abzudecken, ruft der Recycler "onBindViewHolder" auf, um vorhandene Ansichten an der angegebenen Position zu neuen Elementen zu recyceln. Könnten Sie den Code, den Sie versucht haben, veröffentlichen? – satorikomeiji