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

Итак, у меня есть собственный PlaceAutocompleteAdapter на экране с EditText и некоторые другие представления, которые скрыты, когда отображается RecyclerView.Когда место выбирается в списке предложений, EditText заполняется этим адресом, а RecyclerView скрывается, а все остальные элементы отображаются снова.То же самое происходит, когда EditText получает и теряет фокус.Единственная проблема заключается в том, что когда пользователь щелкает обратно в EditText после того, как он заполнен адресом, он застревает и не может скрыть RecyclerView, не изменив текст и не щелкнув другое предложение.

Моя идея состояла в том, чтобы зарегистрировать AdapterDataObserver для PlaceAutocompleteAdapter в его фрагменте, который проверял количество элементов адаптера и скрывал RecyclerView / показывал другие представления, когда было 0 элементов.В противном случае он будет проверять, нужно ли отображать RecyclerView, и реагировать соответствующим образом.

Вот мой код AdapterDataObserver:

     mAdapterObserver = new RecyclerView.AdapterDataObserver() {
        @Override
        public void onChanged() {
            super.onChanged();

            if (mPlaceSuggestionsAdapter.getItemCount() == 0) {
                hidePlaceSuggestions();
            } else if (!ViewUtils.isViewVisible(mPlaceSuggestionsRecyclerView)) {
                showPlaceSuggestions();
            }
        }

        @Override
        public void onItemRangeInserted(int positionStart, int itemCount) {
            super.onItemRangeInserted(positionStart, itemCount);

            if (mPlaceSuggestionsAdapter.getItemCount() == 0) {
                hidePlaceSuggestions();
            } else if (!ViewUtils.isViewVisible(mPlaceSuggestionsRecyclerView)) {
                showPlaceSuggestions();
            }
        }

        @Override
        public void onItemRangeRemoved(int positionStart, int itemCount) {
            super.onItemRangeRemoved(positionStart, itemCount);

            if (mPlaceSuggestionsAdapter.getItemCount() == 0) {
                hidePlaceSuggestions();
            } else if (!ViewUtils.isViewVisible(mPlaceSuggestionsRecyclerView)) {
                showPlaceSuggestions();
            }
        }
    };

    mPlaceSuggestionsAdapter.registerAdapterDataObserver(mAdapterObserver);

Единственная проблема с этим заключается в том, что я незнать, где безопасно отменить регистрацию данных наблюдателя адаптера в жизненном цикле фрагмента.

Я также открыт для других предложений о том, как вывести пользователя из дыры, которая случается.Имейте в виду, что я использую фокусировку EditText, чтобы определить, показывать или нет RecyclerView, и что представлениям, отображаемым, когда RecyclerView скрыт, требуется много логики во фрагменте, исключая возможность использования пустого представления для RecyclerView.,

Существует также подход к удалению фокуса EditText при нажатии на пустой RecyclerView, который будет переключать представления, но я скептически отношусь к тому, что это будет хорошо с точки зрения доступности.

...