Как обновить/обновить определенный элемент в RecyclerView
Я пытаюсь обновить определенный элемент в RecyclerView
.
История: Когда пользователь нажимает на элемент, он показывает AlertDialog
. Пользователь может ввести текст, нажав кнопку "ОК". Я хочу показать этот текст в этом элементе и показать невидимый 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!
Как я могу правильно изменить определенный элемент ItemView, нажав на него?
Ответы
Ответ 1
Вы можете использовать метод notifyItemChanged(int position)
из класса RecyclerView.Adapter. Из документации:
Сообщите зарегистрированным наблюдателям, что позиция в позиции изменилась. Эквивалент вызова notifyItemChanged (позиция, null);.
Это событие изменения позиции, а не событие структурных изменений. Это указывает, что любое отражение данных в позиции устарело и должны быть обновлены. Позиция в позиции сохраняет ту же идентичность.
Поскольку у вас уже есть позиция, она должна работать для вас.
Ответ 2
Обновить один элемент
- Обновите элемент данных
- Уведомить адаптер об изменении с помощью
notifyItemChanged(updateIndex)
пример
Измените пункт "Овцы", чтобы он говорил "Я люблю овец".
![Update single item]()
String newValue = "I like sheep.";
int updateIndex = 3;
data.set(updateIndex, newValue);
adapter.notifyItemChanged(updateIndex);
Мой полный ответ с большим количеством примеров здесь.
Ответ 3
Думаю, у меня есть идея о том, как с этим бороться. Обновление такое же, как удаление и замена в точном положении. Поэтому я сначала удаляю элемент из этой позиции, используя следующий код:
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());
}
Я пытаюсь реализовать это сейчас. Я дам вам отзыв, когда я пройду!
Ответ 4
Я решил решить эту проблему, поймав позицию элемента, который необходимо изменить
а затем в вызове адаптера
public void refreshBlockOverlay(int position) {
notifyItemChanged(position);
}
это вызоветBindViewHolder (держатель ViewHolder, позиция int) для этого конкретного элемента в этой конкретной позиции.
Ответ 5
Добавьте измененный текст в список данных вашей модели
mdata.get(position).setSuborderStatusId("5");
mdata.get(position).setSuborderStatus("cancelled");
notifyItemChanged(position);
Ответ 6
В вашем классе адаптера в методе onBindViewHolder установите ViewHolder в setIsRecyclable (false), как показано ниже.
@Override
public void onBindViewHolder(RecyclerViewAdapter.ViewHolder p1, int p2)
{
// TODO: Implement this method
p1.setIsRecyclable(false);
// Then your other codes
}
Ответ 7
Способ, который сработал лично для меня, заключается в использовании методов адаптера утилит для просмотра изменений в этих элементах.
Это будет происходить примерно так: создайте метод в вашем пользовательском представлении рециркулятора примерно так:
public void modifyItem(final int position, final Model model) {
mainModel.set(position, model);
notifyItemChanged(position);
}
Ответ 8
Ниже решение работало для меня:
В элементе RecyclerView пользователь нажимает кнопку, но другой вид, например TextView, обновляется без непосредственного уведомления адаптера:
Я нашел хорошее решение для этого без использования метода notifyDataSetChanged(), этот метод перезагружает все данные recyclerView, поэтому, если у вас есть изображение или видео внутри элемента, они будут перезагружены, и пользовательский опыт будет плохим:
Вот пример щелчка по значку, похожему на ImageView, и обновления только одного TextView (можно обновить больше видов таким же образом для одного и того же элемента), чтобы отобразить обновление как количества после добавления +1:
// View holder class inside adapter class
public class MyViewHolder extends RecyclerView.ViewHolder{
ImageView imageViewLike;
public MyViewHolder(View itemView) {
super(itemView);
imageViewLike = itemView.findViewById(R.id.imageViewLike);
imageViewLike.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
int pos = getAdapterPosition(); // Get clicked item position
TextView tv = v.getRootView().findViewById(R.id.textViewLikeCount); // Find textView of recyclerView item
resultList.get(pos).setLike(resultList.get(pos).getLike() + 1); // Need to change data list to show updated data again after scrolling
tv.setText(String.valueOf(resultList.get(pos).getLike())); // Set data to TextView from updated list
}
});
}
Ответ 9
вам просто нужно добавить следующий код в диалоговом окне предупреждения при нажатии кнопки Сохранить
recyclerData.add(position, updateText.getText().toString());
recyclerAdapter.notifyItemChanged(position);
Ответ 10
если вы создаете один объект и добавляете его в список, который вы используете в своем адаптере, при изменении одного элемента вашего списка в адаптере все остальные ваши элементы тоже меняются, другими словами, это все о ссылках, а ваш список не держать отдельные копии этого единственного объекта.
Ответ 11
Это тоже моя последняя проблема. Здесь мое решение я использую модель данных и адаптер для моего RecyclerView
/*Firstly, register your new data to your model*/
DataModel detail = new DataModel(id, name, sat, image);
/*after that, use set to replace old value with the new one*/
int index = 4;
mData.set(index, detail);
/*finally, refresh your adapter*/
if(adapter!=null)
adapter.notifyItemChanged(index);
Ответ 12
В вашем адаптере RecyclerView у вас должен быть ArrayList, а также один метод addItemsToList(items)
для добавления элементов списка в ArrayList. Затем вы можете добавлять элементы списка по вызову adapter.addItemsToList(items)
динамически. После того, как все элементы списка добавлены в ArrayList, вы можете вызвать adapter.notifyDataSetChanged()
, чтобы отобразить список.
Вы можете использовать notifyDataSetChanged
в адаптере для RecyclerView