Как сохранить пользовательский интерфейс разблокированным при инициализации адаптераайзера? - PullRequest
0 голосов
/ 17 ноября 2018

Как инициализировать адаптер 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);
        }
    }
}

1 Ответ

0 голосов
/ 17 ноября 2018

Похоже, что вы выполняете слишком много тяжелой обработки при создании элементов RecycerView.

Кроме того, убедитесь, что вы установили это свойство в представлении переработчика recyclerView.setHasFixedSize(true)

Если это не поможет, я бы посоветовал взглянуть на простейший пример здесь https://developer.android.com/guide/topics/ui/layout/recyclerview

Это будет хорошо работать, так что вы можете сравнить его с вашим кодом

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...