android – 在RecyclerView中更新ProgressBar

前端之家收集整理的这篇文章主要介绍了android – 在RecyclerView中更新ProgressBar前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有一个RecyclerView.其中,项目具有标准布局 – 一个TextView和一个ProgressBar.
项目在运行时添加到recyclerview.
每当添加一个Item时,都会启动一个更新ProgressBar的AsyncTask.
AsynTask保存了RecyclerView Adapter对ProgressBar对象的引用.
当回收器视图中的项目太多时,会发生此问题.

我知道RecyclerView会回收任何旧视图,因此想要了解至少进度条的方法.

实现这个的理想方法是什么?

以下是适配器的摘录

  1. public class RecViewAdapter extends
  2. RecyclerView.Adapter<RecViewAdapter.ViewHolder> {
  3. Context mContext;
  4. List<String> mRunns;
  5. static ExecutorService mExec;
  6. static HashSet<Integer> mProcessed = new HashSet<>();
  7.  
  8. public RecViewAdapter(Context context,List<String> runns) {
  9. mContext = context;
  10. mRunns = runns;
  11. mExec = Executors.newFixedThreadPool(1);
  12. }
  13.  
  14. @Override
  15. public ViewHolder onCreateViewHolder(ViewGroup viewGroup,int viewType) {
  16. View v = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.runnabel_item,viewGroup,false);
  17. ViewHolder vh = new ViewHolder(v);
  18. return vh;
  19. }
  20.  
  21. @Override
  22. public void onBindViewHolder(ViewHolder holder,int position) {
  23. holder.runnName.setText(mRunns.get(position));
  24. if (!mProcessed.contains(position)) {
  25. new ProgressTask(holder.pBar,position).executeOnExecutor(mExec,null);
  26. mProcessed.add(position);
  27. }
  28. }
  29.  
  30. @Override
  31. public int getItemCount() {
  32. return mRunns.size();
  33. }
  34.  
  35. public static class ViewHolder extends RecyclerView.ViewHolder {
  36. TextView runnName;
  37. ProgressBar pBar;
  38.  
  39. public ViewHolder(View view) {
  40. super(view);
  41. runnName = (TextView) view.findViewById(R.id.textView);
  42. pBar = (ProgressBar) view.findViewById(R.id.progressBar);
  43. pBar.setIndeterminate(false);
  44. pBar.setMax(100);
  45. pBar.setProgress(0);
  46.  
  47. }
  48. }
  49. }

另外,我正在使用notifydatasetchanged将项目添加到RecyclerView.

解决方法

有点晚了,但我找到了让它运转的方法.

我的recyclerview包含大量的查看者,只有一个查看者有一个进度条.我有一个sqlite数据库,我在其中维护用于在我的服务和活动之间进行同步的标识符(以识别recyclerview中哪些视图需要更新).

根据您的实现,您必须找到一种方法来识别哪个广播事件对应于哪个适配器项.我已经给出了我在下面所做的简化版本.

进度条模型:

  1. class ProgressModel{
  2. String progressId;
  3. int progress = 0;
  4. }
  5.  
  6. public int getProgress(){
  7. return progress;
  8. }

ViewHolder:

  1. public class ProgressViewHolder extends RecyclerView.ViewHolder {
  2. private ProgressBar mProgressBar;
  3.  
  4. public ProgressViewHolder(View itemView) {
  5. mProgressBar = (ProgressBar) itemView.findViewById(R.id.mProgressBar);
  6. }
  7.  
  8. public ProgressBar getProgressBar() {
  9. return mProgressBar;
  10. }
  11. }

在recyclerview适配器中,

  1. @Override
  2. public void onBindViewHolder(ProgressViewHolder holder,int position) {
  3. ProgressModel item = mData.get(position);
  4. int progress = item.getProgress();
  5. if (progress > 0) {
  6. ProgressBar downloadProgress = holder.getProgressBar();
  7. if (downloadProgress.isIndeterminate()) {
  8. downloadProgress.setIndeterminate(false);
  9. }
  10. downloadProgress.setProgress(progress);
  11. }
  12. }
  13.  
  14. public void refresh(position,ProgressModel item){
  15. mData.set(position,item);
  16. notifyItemChanged(position);
  17. }

在实现的Activity中填充视图,创建自身的静态实例并将其传递给BroadcastReceiver.我花了很长时间才发现静态实例是必需的,否则即使我调用notifyItemchanged(),视图也不会改变.

  1. public class MainActivity extends Activity{
  2. private static MainActivity instance;
  3. private MyReceiver mReceiver;
  4. private MyAdapter mAdapter;
  5.  
  6. @Override
  7. protected void onCreate(Bundle savedInstanceState) {
  8. super.onCreate(savedInstanceState);
  9. instance = this;
  10. mReceiver = new MyReceiver(instance);
  11. //TODO: Initialize adapter with data and set to recyclerview
  12. }
  13.  
  14. public void update(Intent intent){
  15. ProgressModel model = new ProgressModel ();
  16. //TODO: set progress detail from intent to model and get position from progressId
  17. instance.mAdapter.refresh(position,model);
  18. }
  19.  
  20. private static class MyReceiver extends BroadcastReceiver {
  21. MainActivity activity;
  22.  
  23. public DownloadReceiver(MainActivity activity) {
  24. this.activity = activity;
  25. }
  26.  
  27. @Override
  28. public void onReceive(Context context,Intent intent) {
  29. //pass intent with progress details to activity
  30. activity.update(intent);
  31. }
  32. }
  33.  
  34. }

希望这可以帮助.

猜你在找的Android相关文章