Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/226.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在使用Room的Android应用程序中,页面列表正在增长,但从未缩小_Java_Android_Kotlin - Fatal编程技术网

Java 在使用Room的Android应用程序中,页面列表正在增长,但从未缩小

Java 在使用Room的Android应用程序中,页面列表正在增长,但从未缩小,java,android,kotlin,Java,Android,Kotlin,在我的Android应用程序中,我有一个非常基本的RecyclerView实现,它使用with显示数据库中的条目 从数据库中获取条目的Dao方法: @Query("SELECT * FROM entries") abstract fun findAll(): DataSource.Factory<Int, Entry> 我只需观察这个LiveData并将更新后的PagedList传递给我的RecyclerView.Adapter 相应的RecyclerView.Adapter代码段

在我的Android应用程序中,我有一个非常基本的
RecyclerView
实现,它使用with显示数据库中的条目

从数据库中获取条目的Dao方法:

@Query("SELECT * FROM entries")
abstract fun findAll(): DataSource.Factory<Int, Entry>
我只需观察这个
LiveData
并将更新后的
PagedList
传递给我的
RecyclerView.Adapter

相应的
RecyclerView.Adapter
代码段:

private val differ = AsyncPagedListDiffer<Entry>(this, DIFF_CALLBACK)

fun submitList(list: PagedList<Entry>) {
    differ.submitList(list)
}
在此之后,我向数据库中插入了5000个条目,相应的日志条目如下:

D/|标记:位置:0 |插入:512 |大小:512

这很好,这是预期的输出

但当我开始在列表中向下滚动时,日志条目如下所示:

D/|标记:位置:512 |插入:256 |大小:768

D/|标签:位置:768 |插入:256 |大小:1024

D/|标签:位置:1024 |插入:256 |大小:1280

D/|标签:位置:1280 |插入:256 |尺寸:1536

然后日志停止在这里,没有更多的日志条目,无论我在这一点后向下滚动多少次

关于这种行为,我的问题是:

  • 为什么从未调用
    onRemoved()

    PagedList
    是否是一个不断增长的列表,项目是否会保留在内存中

    分页的目的不是要按需加载新条目,同时删除旧的(不可见的)条目吗

  • 为什么日志会在1536个条目之后停止,即使我滚动通过该条目

    奇怪的是,即使滚动到列表底部,条目也能正确显示

如果有人能向我解释一下这种行为,我将不胜感激

(也欢迎Java回答)

编辑

整个适配器的代码:

class EntryListAdapter
        : RecyclerView.Adapter<EntryListAdapter.EntryViewHolder>() {

    private val differ = AsyncPagedListDiffer<Entry>(this, DIFF_CALLBACK)

    fun submitList(list: PagedList<Entry>) {
        differ.submitList(list)
    }

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int):
            EntryViewHolder {
        val inflater = LayoutInflater.from(parent.context)
        val entryItemView = inflater.inflate(R.layout.item_entry, parent, false)

        return EntryViewHolder(entryItemView)
    }

    override fun onBindViewHolder(holder: EntryViewHolder, position: Int) {
        differ.getItem(position)?.let { holder.bindTo(it) }
    }

    override fun getItemId(position: Int): Long {
        return differ.getItem(position)?.id ?: RecyclerView.NO_ID
    }

    override fun getItemCount(): Int {
        return differ.currentList?.size ?: 0
    }

    inner class EntryViewHolder(itemView: View) :
            RecyclerView.ViewHolder(itemView) {

        fun bindTo(entry: Entry) {
            itemView.textEntryTitle.text = entry.title
        }
    }

    companion object {
        private val DIFF_CALLBACK = object : DiffUtil.ItemCallback<Entry>() {
            override fun areItemsTheSame(entry1: Entry, entry2: Entry): Boolean {
                return entry1.id == entry2.id
            }

            override fun areContentsTheSame(entry1: Entry, entry2: Entry): Boolean
            {
                return entry1 == entry2
            }
        }
    }
}

Android架构组件团队的克里斯·克雷克(Chris Craik)刚刚确认,到目前为止,分页库不会删除分页数据(但它即将到来):

它被合并了(和),但我们还没有发布它,因为 在AndroidX切换过程中格外小心。阿奇必须小心 避免在AndroidX迁移过程中造成倒退(因为 迁移非常复杂)

现在AndroidX已经稳定了,我们可以发布了,所以我们将了解 很快就出来了


我正在使用AndroidX,但我认为这个问题没有解决。
list.addWeakCallback(differ.currentList?.snapshot(), object : PagedList.Callback() {
    override fun onChanged(position: Int, count: Int) {
        Log.d("_tag", "Position: $position | Changed: $count" +
                " | Size: ${list.size}")
    }

    override fun onInserted(position: Int, count: Int) {
        Log.d("_tag", "Position: $position | Inserted: $count" +
                " | Size: ${list.size}")
    }

    override fun onRemoved(position: Int, count: Int) {
        Log.d("_tag", "Position: $position | Removed: $count" +
                " | Size: ${list.size}")
    }
})
class EntryListAdapter
        : RecyclerView.Adapter<EntryListAdapter.EntryViewHolder>() {

    private val differ = AsyncPagedListDiffer<Entry>(this, DIFF_CALLBACK)

    fun submitList(list: PagedList<Entry>) {
        differ.submitList(list)
    }

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int):
            EntryViewHolder {
        val inflater = LayoutInflater.from(parent.context)
        val entryItemView = inflater.inflate(R.layout.item_entry, parent, false)

        return EntryViewHolder(entryItemView)
    }

    override fun onBindViewHolder(holder: EntryViewHolder, position: Int) {
        differ.getItem(position)?.let { holder.bindTo(it) }
    }

    override fun getItemId(position: Int): Long {
        return differ.getItem(position)?.id ?: RecyclerView.NO_ID
    }

    override fun getItemCount(): Int {
        return differ.currentList?.size ?: 0
    }

    inner class EntryViewHolder(itemView: View) :
            RecyclerView.ViewHolder(itemView) {

        fun bindTo(entry: Entry) {
            itemView.textEntryTitle.text = entry.title
        }
    }

    companion object {
        private val DIFF_CALLBACK = object : DiffUtil.ItemCallback<Entry>() {
            override fun areItemsTheSame(entry1: Entry, entry2: Entry): Boolean {
                return entry1.id == entry2.id
            }

            override fun areContentsTheSame(entry1: Entry, entry2: Entry): Boolean
            {
                return entry1 == entry2
            }
        }
    }
}
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <androidx.recyclerview.widget.RecyclerView
        android:id="@+id/mainRecyclerView"
        android:layout_width="0dp"
        android:layout_height="0dp"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

</androidx.constraintlayout.widget.ConstraintLayout>