具有附加/不同列表项的 FirestorePagingAdapter 由于重用密钥而崩溃

问题描述 投票:0回答:1

我正在使用 FirestorePagingAdapter 从后端使用分页加载数据。

我的 RecyclerView 不仅托管分页请求的结果,还托管根据分页结果显示的数据(想象一个聊天/消息应用程序,其中在每个新的一天,都会将标签添加到用户在滚动时看到的数据集中).

我就是这样完成的

  • 正常使用 FirestorePagingAdapter,但不使用其项目列表
  • 实现了一个 SortedList,负责在需要时添加“标签”
  • 重写 onBindViewHolder,以便它仍然调用
    super.getItem()
    通过分页适配器获取新项目
  • 由于现在包含标签,我们需要找到超级调用的正确位置。我这样做只是通过计算所有未分页的项目并从请求的位置扣除该项目
  • 使用
    addLoadStateListener()
  • 添加通过 PagingAdapter 加载的项目

问题是,由于适配器正在使用分页 3,我收到一条错误消息,提示我在分页中重复使用密钥。此后,应用程序就会崩溃。

The same value was passed as the nextKey in two sequential Pages loaded from a PagingSource

这是一些代码。如果需要,我可以包含更多内容,但这应该是发生错误的部分

@Override
public void onBindViewHolder(@NonNull RecyclerViewHolder<T, ? extends ViewBinding> holder, int position) {
    try {
        //Needed to page the list, although we use the item from our own list
        super.getItem(getPagingPosition(position));
    } catch (Exception ignore) {
        //If this fails, because there are less items in the list, do not crash, this is fine
        Log.d(TAG, "This is an expected exception");
    } finally {
        holder.bind(getList().get(position));
    }
}

protected int getPagingPosition(int requestedPosition) {
    /* TODO: This  could be optimized, it is used A LOT (on every viewholder bind) and has linear runtime */
    int count = 0;
    for (int i = 0; i < requestedPosition; i++) {
        if (!getPagedClass().isInstance(getList().get(i))) count++;
    }
    Log.d(TAG, "getPagingPosition: "+requestedPosition+" maps to "+(requestedPosition-count));
    return requestedPosition - count;
}
android google-cloud-firestore pagination firebaseui
1个回答
1
投票

我找到了答案。它与我的代码无关,而是与 firebaseUI 中的错误有关。版本 8.0.0 仍然可以在 8.0.1 中断分页的情况下工作。已经有一个未解决的问题这里

© www.soinside.com 2019 - 2024. All rights reserved.