Я пытаюсь обновить конкретный элемент в RecyclerView
.
История: когда пользователь нажимает на элемент, он отображается AlertDialog
. Пользователь может ввести текст, нажав кнопку ОК. Я хочу показать этот текст в этом элементе и показать невидимое ImageView
- объявленное в XML и адаптере ViewHolder
-
Я использовал эту функцию в AlertDialog
положительной кнопке, чтобы обновить элемент:
private void updateListItem(int position) {
View view = layoutManager.findViewByPosition(position);
ImageView medicineSelected = (ImageView) view.findViewById(R.id.medicine_selected);
medicineSelected.setVisibility(View.VISIBLE);
TextView orderQuantity = (TextView) view.findViewById(R.id.order_quantity);
orderQuantity.setVisibility(View.VISIBLE);
orderQuantity.setText(quantity + " packet added!");
medicinesArrayAdapter.notifyItemChanged(position);
}
Но этот код не только изменяет itemView в переданной позиции, но также меняет некоторые другие itemView (ы)!
Как мне правильно изменить конкретный itemView, щелкнув по нему?
onBindViewHolder()
Обновить отдельный элемент
notifyItemChanged(updateIndex)
пример
Измените пункт «Овцы» так, чтобы в нем говорилось «Я люблю овец».
Мой полный ответ с другими примерами здесь .
источник
Добавьте измененный текст в список данных вашей модели
источник
Думаю, у меня есть идея, как с этим бороться. Обновление аналогично удалению и замене в точном месте. Поэтому я сначала удаляю элемент из этой позиции, используя приведенный ниже код:
а затем я бы добавил элемент в эту конкретную позицию, как показано ниже:
Я пытаюсь реализовать это сейчас. Я дам вам отзыв, когда закончу!
источник
Мне нужно решить эту проблему, поймав позицию элемента, который необходимо изменить, а затем в вызове адаптера
, это вызовет onBindViewHolder (держатель ViewHolder, позиция int) для этого конкретного элемента в этой конкретной позиции.
источник
Ниже решение сработало для меня:
В элементе RecyclerView пользователь нажмет кнопку, но другое представление, такое как TextView, будет обновляться без прямого уведомления адаптера:
Я нашел хорошее решение для этого без использования метода notifyDataSetChanged (), этот метод перезагружает все данные recyclerView, поэтому, если у вас есть изображение или видео внутри элемента, они будут перезагружены, и пользовательский интерфейс не будет хорошим:
Вот пример того, как щелкнуть значок ImageView like и обновить только один TextView (можно обновить больше видов таким же образом, что и тот же элемент), чтобы отобразить как обновление счетчика после добавления +1:
источник
Для меня лично сработал способ использования методов адаптера recyclerview для обработки изменений в его элементах.
Это будет похоже на это, создать метод в вашем пользовательском представлении ресайклера примерно так:
источник
В вашем классе адаптера в методе onBindViewHolder установите для ViewHolder значение setIsRecyclable (false), как показано в приведенном ниже коде.
источник
вам просто нужно добавить следующий код в диалоговое окно предупреждения при сохранении щелчка
источник
Проблема в том,
RecyclerView.Adatper
что нет методов, возвращающих индекс элемента.Мой обходной путь - создать экземпляр карты для (element, position) s
Friend
) должен реализовыватьhashCode()
иequals()
потому что он является ключевым в хэш-карте.когда элемент изменился,
Хорошо определить вспомогательный метод
Экземпляр карты (
Map<Friend, Integer> posMap
) не обязательно требуется. Если карта не используется, цикл по списку может найти позицию элемента.источник
Это тоже моя последняя проблема. В моем решении я использую модель данных и адаптер для моего RecyclerView
источник
если вы создаете один объект и добавляете его в список, который используете в своем адаптере, когда вы меняете один элемент своего списка в адаптере, все другие элементы тоже меняются, другими словами, все дело в ссылках, а ваш список не держать отдельные копии этого единственного объекта.
источник
В вашем адаптере RecyclerView у вас должен быть ArrayList, а также один метод
addItemsToList(items)
для добавления элементов списка в ArrayList. Затем вы можетеadapter.addItemsToList(items)
динамически добавлять элементы списка по вызову . После того, как все элементы вашего списка добавлены в ArrayList, вы можете вызватьadapter.notifyDataSetChanged()
чтобы отобразить свой список.Вы можете использовать
notifyDataSetChanged
в адаптере для RecyclerViewисточник