Как обновить / обновить sh указанный c элемент RecyclerView без вызова notifiyItemChanged или DiffUtil? - PullRequest
2 голосов
/ 21 апреля 2020

У меня есть вложенный RecyclerViews, и каждая строка / элемент этого recyclerView тоже является recyclerView, и есть внешние события, которые обновят элемент во внутреннем recyclerView. Мой onBindViewHolder внешнего адаптера RecyclerView выглядит так

    @Override
    public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {
            GiftWrappingHorizontalViewHolder viewHolder = (GiftWrappingHorizontalViewHolder) holder;
            viewHolder.giftWrappingRecyclerView.setLayoutManager(new LinearLayoutManager(viewHolder.giftWrappingRecyclerView.getContext(),
                    RecyclerView.HORIZONTAL, false));
            viewHolder.topTextView.setText(dataList.get(position).getTopTextName());
            if(dataList.get(position).getType() == 1) {
                GiftWrappingHorizontalAdapter adapter = new GiftWrappingHorizontalAdapter(dataList.get(position)
                        .getItems(), position);
                viewHolder.giftWrappingRecyclerView.setAdapter(adapter);
                viewHolder.giftWrappingRecyclerView.setItemAnimator(null);
                adapter.setGiftWrappingHorizontalClickListener(giftWrappingHorizontalClickListener);
            } else if(dataList.get(position).getType() == 0){
                GiftWrappingAddOnsAdapter adapter = new GiftWrappingAddOnsAdapter(dataList.get(position)
                        .getItems(), position);
                viewHolder.giftWrappingRecyclerView.setAdapter(adapter);
                viewHolder.giftWrappingRecyclerView.setItemAnimator(null);
                adapter.setGiftWrappingAddOnEventsListener(giftWrappingAddOnEventsListener);
            }

    }

Так что, как вы можете видеть, я связываю внутренние recyclerViews с его адаптерами внутри onBindViewHolder и хочу обновить конкретный c элемент Внутренний recyclerView без вызова notifiyItemChanged, потому что это воссоздает внутренние адаптеры, которые разбиты на страницы, и будет вызывать первую страницу только потому, что внутренние RecyclerViews используют HORIZONTAL LinearLayoutManager.

Есть ли что-нибудь, чтобы достичь этого путем доступа к элементу RecyclerView по своей позиции и вызов notifiyItemChanged для внутреннего RecyclerView?

Ответы [ 2 ]

1 голос
/ 21 апреля 2020

Вы можете попробовать с помощью notifyItemChanged()

notifyItemChanged(int position, Object payload)

Уведомить любых зарегистрированных наблюдателей, что элемент позиции изменился с помощью дополнительного объекта полезной нагрузки .

LOGI C

arrayList.set(updatePosition, yourValue);
adapterOBJ.notifyItemChanged(updatePosition);
0 голосов
/ 21 апреля 2020

LiveData

Самое интересное, что вы можете использовать его непосредственно в макете

<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools">

    <data>
        <variable name="myTextLiveData" type="String" />
    </data>

    <TextView
    ...
      android:text="@{myTextLiveData}
    />

</layout>

В адаптере onBind () вы можете установить жилые данные объекта и где бы вы ни находились обновите aliveata.setValue («новое значение»), оно сразу отразится.

Я строго предполагаю, что вы обновляете только часть данных. Если ваши данные собираются изменить порядок или размер списка, лучше придерживаться notifyItemChanged ()

Вы также можете рассмотреть DiffUtil

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...