【问题标题】:SortedList IndexOutOfBoundsException: Inconsistency detected. Invalid item position on remove last itemSortedList IndexOutOfBoundsException:检测到不一致。删除最后一个项目时的项目位置无效
【发布时间】:2017-11-19 15:00:24
【问题描述】:

我有无休止的滚动 RecyclerView。数据存储在 SortedList 中。当用户向下滚动时,加载项会在接下来的 10 个项目加载时出现并消失。删除 LoaderItem 时出现以下错误:

java.lang.IndexOutOfBoundsException: Inconsistency detected. Invalid item position 10(offset:-1).state:11
                                                                     at android.support.v7.widget.RecyclerView$Recycler.tryGetViewHolderForPositionByDeadline(RecyclerView.java:5512)
                                                                     at android.support.v7.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:5448)
                                                                     at android.support.v7.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:5444)
                                                                     at android.support.v7.widget.LinearLayoutManager$LayoutState.next(LinearLayoutManager.java:2224)
                                                                     at android.support.v7.widget.LinearLayoutManager.layoutChunk(LinearLayoutManager.java:1551)
                                                                     at android.support.v7.widget.LinearLayoutManager.fill(LinearLayoutManager.java:1511)
                                                                     at android.support.v7.widget.LinearLayoutManager.onLayoutChildren(LinearLayoutManager.java:595)
                                                                     at android.support.v7.widget.RecyclerView.dispatchLayoutStep1(RecyclerView.java:3551)
                                                                     at android.support.v7.widget.RecyclerView.onMeasure(RecyclerView.java:3030)
                                                                     at android.view.View.measure(View.java)

这是我的代码:

适配器:

val battles = SortedList(RecyclerViewItem::class.java, object : SortedListAdapterCallback<RecyclerViewItem>(this)
{
    override fun areItemsTheSame(item1 : RecyclerViewItem?, item2 : RecyclerViewItem?) : Boolean
    {
        if (item1 is Battle && item2 is Battle && item1.id == item2.id) return true
        if (item1 is LoaderItem && item2 is LoaderItem) return true
        return false
    }

    override fun compare(o1 : RecyclerViewItem?, o2 : RecyclerViewItem?) : Int =
    if (o1 is Battle && o2 is Battle)
    {
        when
        {
            o1.points > o2.points  -> 1
            o1.points == o2.points -> 0
            else            -> -1
        }
    }
    else -1
    override fun areContentsTheSame(oldItem : RecyclerViewItem?, newItem : RecyclerViewItem?) : Boolean = if (oldItem is LoaderItem) true
    else (oldItem as Battle).points == (newItem as Battle).points

})

fun removeLoadingItem()
{
    (0 until battles.size()).filter { battles[it] is LoaderItem }.forEach { battles.removeItemAt(it) }
}

fun addDownloadedItems(battles : List<Battle>)
{
    this.battles.addAll(battles)
}

片段:

override fun displayDownloadedBattles(battles : List<Battle>, isMore : Boolean) {
    pbLoader.visibility = View.GONE
    isLoading = false
    if (isMore)
        adapter.removeLoadingItem()
    adapter.addDownloadedItems(battles)
}

【问题讨论】:

    标签: android android-recyclerview kotlin sortedlist


    【解决方案1】:
      (0 until battles.size()).filter { battles[it] is LoaderItem }.forEach { battles.removeItemAt(it) }
    

    此片段包含错误:第一次删除后索引序列不正确。 你可以循环到。 为什么不使用

    battles.filter { it is LoaderItem }.forEach { battles.remove(it) }
    

    【讨论】:

      猜你喜欢
      • 2017-09-30
      • 2018-12-04
      • 2016-12-10
      • 2015-08-08
      • 1970-01-01
      • 2020-01-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多