android – 在RecyclerView中更新ProgressBar

android – 在RecyclerView中更新ProgressBar,第1张

概述我有一个RecyclerView.其中,项目具有标准布局 – 一个TextView和一个ProgressBar. 项目在运行时添加到recyclerview. 每当添加一个Item时,都会启动一个更新ProgressBar的AsyncTask. AsynTask保存了RecyclerView Adapter对ProgressBar对象的引用. 当回收器视图中的项目太多时,会发生此问题. 我知道Re 我有一个RecyclerVIEw.其中,项目具有标准布局 – 一个TextVIEw和一个Progressbar.
项目在运行时添加到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所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/1139156.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-05-31
下一篇2022-05-31

发表评论

登录后才能评论

评论列表(0条)

    保存