Скрыть View, если RecyclerView пуст
Есть Activity, в макете которой, для отображения списка, размещен RecyclerView. В этой же разметке, поверх RecyclerView, находится TextView. Это надпись "Добавить запись" на представленных скриншотах.
В RecyclerView новую запись можно добавить, нажав по значку "+" в правом верхнем углу скриншота. Появится диалоговое окно (DialogFragment) с формой создания новой записи.
Удаление записи происходит свайпом.
Хочу сделать так, что бы при при пустом RecyclerView надпись "Добавить запись" отображалась. Но при появлении в списке RecyclerView хотя бы одной записи, надпись исчезала. Соответственно, при удалении последней записи в списке, нужно что бы надпись снова появлялась. И да, все это динамически: добавил запись в список - надпись исчезла, удалил последнюю - появилась.
Погуглил, поискал решение здесь. Нашел пару вопросов: тут и на en-SO тут, но в решении моего вопроса это не помогло.
Попробовал сделать скрытие TextView при появлении записи в RecyclerView так: в активити в методе onCreate добавил условие
TextView noticeAdd = findViewById(R.id.noticeAdd);
if (linearLayoutManager.getItemCount() == 0) {
noticeAdd.setVisibility(View.VISIBLE);
} else noticeAdd.setVisibility(View.INVISIBLE);
В результате это работает только если обновить активити. Нужно же, что бы сразу надпись исчезала и появлялась при добавлении/удалении записи в RecyclerView. Поясню в скриншотах.

Screenshot 1: В списке RecyclerView не добавлено ни одной записи, соответственно TextView отображается.
Screenshot 2: Ожидаемый результат. Добавил запись в RecyclerView, надпись исчезла. Так должно быть.
Screenshot 3: Как сейчас есть на самом деле. При добавлении записи, надпись "Добавить запись" все равно остается, хотя должна исчезнуть. Исчезает только при обновлении (пересоздании) активити.
И да, вариант с onResume не подходит, удаление, напомню, происходит свайпом.
Как скрыть/показать View (надпись "Добавить запись"), при добавлении/удалении записи в RecyclerView не обновляя активити?
Ответы (3 шт):
Каждый раз когда обновляте лист вы должны проверить лист на isEmpty(). Если лист пустой тогда надо показывать textView иначе скрыть.
public void setDataToAdapter(List<Note> notes) {
if (notes.isEmpty()) {
// show textView
} else {
// hide textView
}
adapter.setNotes(notes);
adapter.notifyDataSetChanged();
}
и при свайпе
public void onSwipe(int position) {
notes.remove(position);
if (notes.isEmpty()) {
// show textView
} else {
// hide textView
}
adapter.notifyItemRemoved(position);
}
Я это делаю примерно так:
лейаут:
<androidx.recyclerview.widget.RecyclerView
style="@style/RecyclerViewStyle"
android:id="@+id/recordRecyclerView"
android:layout_width="match_parent"
android:layout_height="match_parent"
/>
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:textAlignment="center"
android:id="@+id/emptyText"
android:textSize="@dimen/increased_text_size"
android:text="Press (+) button to add record"
android:layout_margin="@dimen/default_narrow_margin"/>
Далее при раскрутке RecyclerView в onCreateView() пишем примерно такой код:
int itemCount = adapter.getItemCount();
if(itemCount > 0)
binding.emptyText.setVisibility(View.GONE);
else
binding.emptyText.setVisibility(View.VISIBLE);
binding - это View Binding лейаута, adapter - соответственно адаптер списка.
В итоге, я сделал это с помощью наблюдателя адаптера RecyclerView.
В активити, содержащем RecyclerView, в onCreate:
TextView noticeAddEx = findViewById(R.id.noticeAddEx); //Надпись, которую нужно скрыть
Check check = new Check();
check.showHide_View(arrayList, noticeAddEx);//При создании активити, если RV пуст, то показать надпись. Иначе скрыть.
createPlanAdapter.registerAdapterDataObserver(new RecyclerView.AdapterDataObserver() {
@Override //Скрыть/показать View при добавлении в список RV
public void onItemRangeInserted(int positionStart, int itemCount) {
check.showHide_View(arrayList, noticeAddEx);
}
@Override //Скрыть/показать View при удалении из списка RV
public void onItemRangeRemoved(int positionStart, int itemCount) {
check.showHide_View(arrayList, noticeAddEx);
}
});
arrayList - модель данных из БД для отображения в RecyclerView
В отдельном классе Check, создал метод:
public void showHide_View(ArrayList<?> arrayList, View viewHideShow) {
if(arrayList.isEmpty()) {
viewHideShow.setVisibility(View.VISIBLE);
} else viewHideShow.setVisibility(View.INVISIBLE);
}
AdapterDataObserver просто следит за добавлением и удалением записей в RecyclerView и проверяет условие на пустой arrayList.
Позже появилась необходимость сделать удаление записи в RecyclerView еще и из диалога, по нажатию кнопки. Мне бы пришлось вставлять условия проверки в разные места: при добавлении, при удалении свайпом, при удалении через диалог. А так просто адаптер следит за двумя операциями - добавления и удаления записи в RV, ему не важно с помощью чего это реализовано.
С помощью этого же метода showHide_View добавил скрытие/отображение надписи у других RecyclerView в приложении, т.к. параметры метода позволяют передавать ArrayList с разными типами данных. Да и скрывать/отбражать не только TextView, но вообще любой view.