В RecyclerView.Adapter notifyItemChanged не всегда вызывает onBindViewHolder - PullRequest
0 голосов
/ 01 апреля 2020

Я имею дело с довольно раздражающей ошибкой, когда множественные (идентичные) вызовы notifyItemChanged () иногда вызывают только onBindViewHolder (). Я вызываю notifyItemChanged так:

public void updateData(Data stuff) {

  // Update data.
  int index = findIndexOfChangedItem(stuff);

  // Using or adding notifyDataSetChanged() doesn't help.
  notifyItemChanged(index);
}

И onBindViewHolder довольно прост.

@Override
public void onBindViewHolder(MyItemViewHolder holder, int position) {
    Log.d(TAG, "onBindViewHolder called for position " + position);
    holder.setData(myList.get(position));
}

Проблема, которую я наблюдаю, заключается в том, что когда updateData () вызывается много раз (иногда часто, много раз) в течение секунды) некоторые из обновлений сбрасываются. Но он делает go в половину времени, поэтому я знаю, что реализация basi c несколько работает.

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

private RecyclerView.AdapterDataObserver obs = new RecyclerView.AdapterDataObserver() {
    @Override
    public void onChanged() {
      Log.d(TAG, "Observed state change in custom observer.");
      super.onChanged();
    }
  };

Я вижу, что пользовательский наблюдатель срабатывает каждый раз !

Есть ли причина, почему RecyclerView.Adapter onBindViewHolder иногда пропускается, и есть ли способ обойти это?

Edit

Интересно, это из-за androidx.recyclerview.widget.AdapterHelper onItemRangeChanged возвращает только 1024 *, если обновляется только одна вещь:

/**
 * @return True if updates should be processed.
 */
boolean onItemRangeChanged(int positionStart, int itemCount, Object payload) {
    if (itemCount < 1) {
        return false;
    }
    mPendingUpdates.add(obtainUpdateOp(UpdateOp.UPDATE, positionStart, itemCount, payload));
    mExistingUpdateTypes |= UpdateOp.UPDATE;
    return mPendingUpdates.size() == 1;
}

Затем, если я добавляю обновление, пока оно уже находится в состоянии ожидания, возвращается false, и мое обновление отбрасывается .

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