
项目在运行时添加到recyclervIEw.
每当添加一个Item时,都会启动一个更新Progressbar的AsyncTask.
AsynTask保存了RecyclerVIEw Adapter对Progressbar对象的引用.
当回收器视图中的项目太多时,会发生此问题.
我知道RecyclerVIEw会回收任何旧视图,因此想要了解至少进度条的方法.
实现这个的理想方法是什么?
以下是适配器的摘录
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); } }} 另外,我正在使用notifydatasetchanged将项目添加到RecyclerVIEw.
解决方法 有点晚了,但我找到了让它运转的方法.我的recyclervIEw包含大量的查看者,只有一个查看者有一个进度条.我有一个sqlite@R_419_6948@,我在其中维护用于在我的服务和活动之间进行同步的标识符(以识别recyclervIEw中哪些视图需要更新).
根据您的实现,您必须找到一种方法来识别哪个广播事件对应于哪个适配器项.我已经给出了我在下面所做的简化版本.
进度条模型:
class ProgressModel{ String progressID; int progress = 0;}public int getProgress(){ return progress;} VIEwHolder:
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; } } 在recyclervIEw适配器中,
@OverrIDepublic 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);} 在实现的Activity中填充视图,创建自身的静态实例并将其传递给broadcastReceiver.我花了很长时间才发现静态实例是必需的,否则即使我调用notifyItemchanged(),视图也不会改变.
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); } }} 希望这可以帮助.
总结以上是内存溢出为你收集整理的android – 在RecyclerView中更新ProgressBar全部内容,希望文章能够帮你解决android – 在RecyclerView中更新ProgressBar所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)