在RecyclerView中更新ProgressBar

我有一个RecyclerView。 其中的项目有一个标准的布局 - 一个TextView和一个ProgressBar。 项目在运行时被添加到recyclerview。 每当添加一个Item时,就会启动一个AsyncTask来更新ProgressBar。 AsynTask持有对RecyclerView适配器中的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数据库,我在其中维护用于在我的服务和活动之间同步的标识符(以识别回收站视图中哪些视图需要更新)。

根据您的实施情况,您必须找到一种方法来确定哪个广播事件对应于哪个适配器项目。 我已经给出了我在下面所做的简化版本。

进度条模型:

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;
    }   
}

在回收视图适配器中,

@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);
}

在实现填充视图的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);
        }
    }

}

希望这可以帮助。

链接地址: http://www.djcxy.com/p/84777.html

上一篇: Updating a ProgressBar in a RecyclerView

下一篇: Schema.org's WebSite vs WebPage