Итак, у меня есть собственный 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, который будет переключать представления, но я скептически отношусь к тому, что это будет хорошо с точки зрения доступности.