2015-04-26 32 views
7

Bir RecyclerView var. İçinde, öğeler standart bir düzen var - bir TextView ve bir ProgressBar. Öğeler, çalışma zamanında geri dönüşüm görüntüsüne eklenir. Bir Öğe eklendiğinde, ProgressBar'ı güncelleyen bir AsyncTask başlatılır. AsynTask, RecyclerView Bağdaştırıcısından ProgressBar nesnesine bir başvuru içerir. Geri dönüştürücü görünümünde çok fazla öğe olduğunda sorun oluşuyor.Geri Dönüşüm Kutusu'nda bir ProgressBar Güncelleme

RecyclerView öğesinin eski görünümleri geri dönüştürdüğünü biliyorum ve bu nedenle, ilerleme çubukları için bu atleast etrafında bir yol istiyorum.

Bunu uygulamak için ideal yol ne olurdu?

takiben Ayrıca, notifydatasetchanged kullanarak RecyclerView öğe ekleme ediyorum Adaptörü

public class RecViewAdapter extends 
     RecyclerView.Adapter<RecViewAdapter.ViewHolder> { 
    Context mContext; 
    List<String> mRunns; 
    static ExecutorService mExec; 
    static HashSet<Integer> mProcessed = new HashSet<>(); 

    public RecViewAdapter(Context context, List<String> runns) { 
     mContext = context; 
     mRunns = runns; 
     mExec = Executors.newFixedThreadPool(1); 
    } 

    @Override 
    public ViewHolder onCreateViewHolder(ViewGroup viewGroup, int viewType) { 
     View v = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.runnabel_item, viewGroup, 
       false); 
     ViewHolder vh = new ViewHolder(v); 
     return vh; 
    } 

    @Override 
    public void onBindViewHolder(ViewHolder holder, int position) { 
     holder.runnName.setText(mRunns.get(position)); 
     if (!mProcessed.contains(position)) { 
      new ProgressTask(holder.pBar, position).executeOnExecutor(mExec, null); 
      mProcessed.add(position); 
     } 
    } 

    @Override 
    public int getItemCount() { 
     return mRunns.size(); 
    } 

    public static class ViewHolder extends RecyclerView.ViewHolder { 
     TextView runnName; 
     ProgressBar pBar; 

     public ViewHolder(View view) { 
      super(view); 
      runnName = (TextView) view.findViewById(R.id.textView); 
      pBar = (ProgressBar) view.findViewById(R.id.progressBar); 
      pBar.setIndeterminate(false); 
      pBar.setMax(100); 
      pBar.setProgress(0); 

     } 
    } 
} 

bir alıntıdır.

+0

Bireysel AsynTasks'ın BroadCast alıcıları aracılığıyla ilgili görünümlerini güncellemeye çalışıyorum. Her yayın güncellemesinde, asynctask bir yayın amacı gönderir. BroadCast alıcısı, ProgressBar'ı güncelleyecek olan aktivitede bir işlevi çağıracaktır. –

cevap

4

Biraz geç, ama işe yaramanın bir yolunu buldum.

Geri dönüşümcül görünümünde çok sayıda görüntüleyen var ve yalnızca görüntüleyenlerden bir ilerleme çubuğu var. Hizmet ve faaliyetlerim arasında eşitlemek için kullandığım tanımlayıcıları koruduğum bir sqlite veritabanına sahibim (geri bildirim görüntüsündeki hangi görünümlerin güncellenmesi gerektiğini belirlemek için). Uygulamanıza bağlı olarak hangi yayın olayının hangi bağdaştırıcı öğesine karşılık geldiğini belirlemenin bir yolunu bulmanız gerekir. Aşağıda yaptıklarımın basitleştirilmiş bir versiyonunu verdim. İlerleme Bar

Modeli:

ViewHolder
class ProgressModel{ 
    String progressId; 
    int progress = 0; 
} 

public int getProgress(){ 
    return progress; 
} 

: recyclerview adaptörü olarak

public class ProgressViewHolder extends RecyclerView.ViewHolder { 
    private ProgressBar mProgressBar; 

    public ProgressViewHolder(View itemView) { 
     mProgressBar = (ProgressBar) itemView.findViewById(R.id.mProgressBar); 
    } 

    public ProgressBar getProgressBar() { 
     return mProgressBar; 
    } 
} 

, uygulayan Bir Etkinlikte

@Override 
public void onBindViewHolder(ProgressViewHolder holder, int position) { 
    ProgressModel item = mData.get(position); 
    int progress = item.getProgress(); 
     if (progress > 0) { 
      ProgressBar downloadProgress = holder.getProgressBar(); 
      if (downloadProgress.isIndeterminate()) { 
       downloadProgress.setIndeterminate(false); 
      } 
      downloadProgress.setProgress(progress); 
     } 
} 

public void refresh(position, ProgressModel item){ 
    mData.set(position, item); 
    notifyItemChanged(position); 
} 

görünümü doldurur, statik örneğini oluşturmak Kendisi ve BroadcastReceiver'a iletin. Statik örneğe ihtiyaç duyulduğunu anlamak beni biraz zaman aldı, aksi halde notifyItemchanged() işlevini çağırsam da görünüm değişmez.

public class MainActivity extends Activity{ 
    private static MainActivity instance; 
    private MyReceiver mReceiver; 
    private MyAdapter mAdapter; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     instance = this; 
     mReceiver = new MyReceiver(instance); 
     //TODO: Initialize adapter with data and set to recyclerview 
    } 

    public void update(Intent intent){ 
     ProgressModel model = new ProgressModel(); 
     //TODO: set progress detail from intent to model and get position from progressId 
     instance.mAdapter.refresh(position,model); 
    } 

    private static class MyReceiver extends BroadcastReceiver { 
     MainActivity activity; 

     public DownloadReceiver(MainActivity activity) { 
      this.activity = activity; 
     } 

     @Override 
     public void onReceive(Context context, Intent intent) { 
      //pass intent with progress details to activity 
      activity.update(intent); 
     } 
    } 

} 

Bu yardımcı olur umarım.

İlgili konular