У меня есть RecyclerView. В нем элементы имеют стандартный макет - один TextView и один ProgressBar. Элементы добавляются в recyclerview во время выполнения. Всякий раз, когда добавляется Item, запускается AsyncTask, который обновляет ProgressBar. AsynTask содержит ссылку на объект ProgressBar из адаптера RecyclerView. Проблема возникает, когда в ресайклере слишком много элементов.
Я знаю, что 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);
}
}
}
Кроме того, я добавляю элементы в RecyclerView, используя notifydatasetchanged.