Подтвердить что ты не робот

Как обновить/обновить определенный элемент в 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, нажав на него?

4b9b3361

Ответ 1

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

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

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

Поскольку у вас уже есть позиция, она должна работать для вас.

Ответ 2

Обновить один элемент

  1. Обновите элемент данных
  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