#android #android-studio #android-layout #android-recyclerview
Вопрос:
Recyclerview содержит карточку с тремя текстовыми изображениями(имя, адрес электронной почты, телефон), извлеченными из базы данных. Я хочу скрыть всплывающее окно от просмотра, если оно содержит имя, равное определенной строке. То, что я попытался сделать, это после извлечения данных из базы данных, я использовал оператор if для сравнения имени со строкой, и если оно равно, они делают вывод карты невидимым. но многие карты становятся невидимыми, если условие удовлетворяет
if (dealer.getName().equals("abcde"))
cardlayout.setVisibility(View.GONE);
Комментарии:
1. Я думаю, что лучшим подходом к этой проблеме было бы удалить соответствующий элемент из списка элементов.
2. да, и, пожалуйста, покажите свой класс адаптера rv и класс активности.
Ответ №1:
Мне кажется, что в ваших элементах RecyclerView есть несколько элементов с visibility
оф Gone
.
И я уверен, что вы делаете эту логику в onBindViewHolder()
в RecyclerView.Adapter
Почему вы оказались в такой ситуации?
onBindViewHolder()
вызывается с этим элементом , когда элемент инициализирован, и когда вы переходите в другую позицию, вы больше не видите этот элемент и возвращаетесь к этой позиции элемента.
В окне вторичной переработки.Документация по адаптеру, Google говорит о onBindViewHolder()
:
Вызывается RecyclerView для отображения данных в указанной позиции. Этот метод должен обновить содержимое файла RecyclerView.ViewHolder.ItemView, чтобы отразить элемент в заданной позиции.
И
вы должны использовать параметр position только при получении соответствующего элемента данных внутри этого метода и не должны хранить его копию.
По этой причине, когда вы повторно прокручиваете элемент перед ним или после него, и вы не устанавливаете для своего элемента другой регистр, значение элемента перед ним или после него onBindViewHolder
вернет ваше содержимое в элемент, в котором вы установили скрытую логику отображения карт.
Как решить эту проблему?
Для скрытой логики , которая отображает или изменяет элементы представления onBindViewHolder()
, убедитесь, что если у вас есть дело if
, у вас есть дело else
.
YourRecyclerViewAdapter.kt
override fun onBindViewHolder(holder: YourViewHolder, position: Int) {
...
if (dealer.name == "abcde") {
cardLayout.visibility = View.GONE
} else { // You should have else case to return the correct content for other positions
cardLayout.visibility = View.VISIBLE
}
...
}