Как обновить / обновить определенный элемент в RecyclerView

Я пытаюсь обновить определенный элемент в RecyclerView .

История. Когда пользователь нажимает на элемент, он показывает AlertDialog . Пользователь может ввести текст, нажав кнопку ok. Я хочу показать этот текст в этом элементе и показать невидимый ImageView – объявленный в XML и адаптер ViewHolder

Я использовал эту функцию в AlertDialog Positive Button для обновления элемента:

 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!

Как правильно изменить конкретный элемент управления, щелкнув по нему?

Вы можете использовать метод notifyItemChanged(int position) из класса RecyclerView.Adapter. Из документации:

Сообщите зарегистрированным наблюдателям, что позиция в позиции изменилась. Эквивалент вызова notifyItemChanged (позиция, null) ;.

Это событие изменения позиции, а не событие структурных изменений. Это указывает на то, что любое отражение данных в позиции устарело и должно быть обновлено. Позиция в позиции сохраняет идентичность.

Поскольку у вас уже есть эта должность, она должна работать на вас.

Я думаю, что у меня есть идея о том, как с этим бороться. Обновление такое же, как удаление и замена в точном положении. Поэтому я сначала удаляю элемент из этой позиции, используя следующий код:

 public void removeItem(int position){ mData.remove(position); notifyItemRemoved(position); notifyItemRangeChanged(position, mData.size()); } 

И затем я бы добавил элемент в этом конкретном положении, как показано ниже:

 public void addItem(int position, Landscape landscape){ mData.add(position, landscape); notifyItemInserted(position); notifyItemRangeChanged(position, mData.size()); } 

Я пытаюсь реализовать это сейчас. Я дам вам отзыв, когда я пройду!

Я должен решить эту проблему, поймав позицию элемента, который необходимо изменить, а затем в вызове адаптера

 public void refreshBlockOverlay(int position) { notifyItemChanged(position); } 

, Это вызоветBindViewHolder (держатель ViewHolder, позиция int) для этого конкретного элемента в этой конкретной позиции.

В вашем адаптере RecyclerView у вас должен быть ArrayList, а также один метод addItemsToList(items) для добавления элементов списка в ArrayList. Затем вы можете добавлять элементы списка по вызову adapter.addItemsToList(items) динамически. После того, как все элементы списка добавлены в ArrayList, вы можете вызвать adapter.notifyDataSetChanged() чтобы отобразить список.

Вы можете использовать notifyDataSetChanged в адаптере для RecyclerView