Как инициализировать адаптер RecyclerView без блокировки интерфейса?Все, что я хочу сделать, это показать индикатор выполнения во время создания представлений адаптеров, а после того, как эта операция будет выполнена, скрыть индикатор выполнения и показать завершенный адаптер повторного просмотра.
Проблема заключается в том, когда i .setAdapter (), пользовательский интерфейсна короткое время зависает, и в этот момент прогрессбар замораживается.
Я не могу понять, как решить эту проблему, поскольку операции, связанные с просмотром, должны выполняться в потоке пользовательского интерфейса.
Есть идеи?
Код: загрузка данных издБ:
dataLoader = Observable
.just(getApplication().getDbHelper())
.map(this::doInBackground)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(this::onPostExecute);
Метод onPostExecute:
entriesAdapter = new EntriesAdapter(getApplication(), loadedData.entries);
this.loadedData = loadedData;
RecyclerView.LayoutManager layoutManager = new LinearLayoutManager(getContext());
viewHolder.entries.setHasFixedSize(true);
viewHolder.entries.setLayoutManager(layoutManager);
viewHolder.entries.setItemAnimator(new DefaultItemAnimator());
viewHolder.entries.setAdapter(entriesAdapter);
Код адаптеров:
public class EntriesAdapter extends RecyclerView.Adapter<EntriesAdapter.ViewHolder> {
private BudgeterApplication app;
private List<Expense> entries;
private CompositeDisposable compositeDisposable;
public EntriesAdapter(BudgeterApplication app, List<Expense> entries) {
this.app = app;
this.entries = entries;
}
public void setEntries(List<Expense> entries) {
this.entries = entries;
}
@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
return new ViewHolder(LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.expense_list_row, viewGroup, false));
}
@Override
public void onBindViewHolder(@NonNull ViewHolder viewHolder, int i) {
Expense expense = entries.get(i);
viewHolder.getSumText().setText(BigDecimalUtils.convertToCurrencyString(expense.getSum()));
viewHolder.getCommentText().setText(expense.getComment() == null ? "" : expense.getComment());
viewHolder.getDateText().setText(DateUtils.convertToString(expense.getTimeStamp(), "MM-dd HH:mm"));
}
@Override
public void onAttachedToRecyclerView(@NonNull RecyclerView recyclerView) {
compositeDisposable = new CompositeDisposable();
super.onAttachedToRecyclerView(recyclerView);
}
@Override
public void onDetachedFromRecyclerView(@NonNull RecyclerView recyclerView) {
if (compositeDisposable != null && !compositeDisposable.isDisposed()) {
compositeDisposable.dispose();
}
super.onDetachedFromRecyclerView(recyclerView);
}
@Override
public int getItemCount() {
return entries.size();
}
@Getter
class ViewHolder extends RecyclerView.ViewHolder {
private View parent;
private TextView sumText;
private TextView commentText;
private TextView dateText;
ViewHolder(@NonNull View itemView) {
super(itemView);
this.parent = itemView;
init();
}
private void init() {
sumText = parent.findViewById(R.id.sum_text);
commentText = parent.findViewById(R.id.comment_text);
dateText = parent.findViewById(R.id.date_text);
}
}
}