Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/337.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 NestedScrollView内部的RecyclerView问题_Java_Android_Android Recyclerview_Android Nestedscrollview - Fatal编程技术网

Java NestedScrollView内部的RecyclerView问题

Java NestedScrollView内部的RecyclerView问题,java,android,android-recyclerview,android-nestedscrollview,Java,Android,Android Recyclerview,Android Nestedscrollview,我遇到了一个与recyclerView相关的问题。所以我在NestedScrollView中使用它。我知道这对性能不好,但目前我没有其他解决方案 我对列表进行了分页,并将逻辑设置为nestedScrollView。因此,当它到达底部时,我加载下一个列表。当更新我的列表时,我会调用我的适配器notifyDataSetChanged 看看发生了什么事。我为每个分页加载30个项目。当我加载前30个项目时,我将它们交给适配器,适配器会立即绑定所有项目。这没关系,因为它位于nestedScrollView

我遇到了一个与
recyclerView
相关的问题。所以我在
NestedScrollView
中使用它。我知道这对性能不好,但目前我没有其他解决方案

我对列表进行了分页,并将逻辑设置为
nestedScrollView
。因此,当它到达底部时,我加载下一个列表。当更新我的列表时,我会调用我的适配器
notifyDataSetChanged

看看发生了什么事。我为每个分页加载30个项目。当我加载前30个项目时,我将它们交给适配器,适配器会立即绑定所有项目。这没关系,因为它位于
nestedScrollView
中。当我滚动到底部并加载接下来的30个项目时,我正在调用
notifyDataSetChanged
让适配器更新UI。但这一次,它没有绑定接下来的30项,而是一次绑定所有60项。每次我加载越来越多的项,情况就变得越来越糟,因为它绑定了适配器中的所有项。有没有办法防止这种情况并只绑定新添加的项


很抱歉,我无法上传代码部分。没有什么特别的,它是一个简单的
recyclerview
内部
nestedScrollView

分页工作正常,应该在滚动上加载越来越多的内容。如果只需要最新版本,则可以在api函数上执行一项操作重新初始化arraylist,使其仅绑定最新的30个版本。

分页工作正常,滚动时应加载越来越多的内容。如果只需要最新版本,则可以在api函数上执行一项操作重新初始化arraylist,使其仅绑定最新的30个版本。

可能会使用一种可行的解决方案。一旦实现了DiffCallback,您就可以这样使用它(摘自文档)

实际上我并没有尝试过,但这样只能绑定更新的项目

您实际遇到的问题是,由于您的RecyclerView位于ScrollView中,因此视图从未真正被回收,一旦调用notifyDataSetChanged,就会触发对所有项目的绑定

编辑-使用ListAdapter

我最近也有一个类似的问题需要解决,我最终使用的是简化了DiffUtils的使用

class ItemsAdapter() :
    ListAdapter<Item, ItemViewHolder>(ItemComparator()) {

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) = 
        ItemViewHolder(parent)

    override fun onBindViewHolder(holder: ItemViewHolder, position: Int) {
        holder.bind(getItem(position))
    }
}

class ItemComparator : DiffUtil.ItemCallback<Item>() {
    override fun areItemsTheSame(oldItem: Item, newItem: Item): Boolean {
        return oldItem.id == newItem.id
    }

    override fun areContentsTheSame(oldItem: Item, newItem: Item): Item {
        return oldItem.prop1 == newItem.prop1 &&
                oldItem.prop2 == newItem.prop2 &&
                oldItem.prop3 == newItem.prop3
    }
}
class ItemsAdapter():
ListAdapter(ItemComparator()){
重写onCreateViewHolder(父级:ViewGroup,viewType:Int)=
ItemViewHolder(父项)
覆盖BindViewHolder(holder:ItemViewHolder,位置:Int){
持有者绑定(获取项目(位置))
}
}
类ItemComparator:DiffUtil.ItemCallback(){
覆盖乐趣项相同(旧项:项,新项:项):布尔值{
返回oldItem.id==newItem.id
}
覆盖内容相同(旧项:项,新项:项):项{
返回oldItem.prop1==newItem.prop1&&
oldItem.prop2==newItem.prop2&&
oldItem.prop3==newItem.prop3
}
}

在活动/片段中,当您获得新页面时,只需调用
adapter.submitList(items)
就可以使用一个可行的解决方案。一旦实现了DiffCallback,您就可以这样使用它(摘自文档)

实际上我并没有尝试过,但这样只能绑定更新的项目

您实际遇到的问题是,由于您的RecyclerView位于ScrollView中,因此视图从未真正被回收,一旦调用notifyDataSetChanged,就会触发对所有项目的绑定

编辑-使用ListAdapter

我最近也有一个类似的问题需要解决,我最终使用的是简化了DiffUtils的使用

class ItemsAdapter() :
    ListAdapter<Item, ItemViewHolder>(ItemComparator()) {

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) = 
        ItemViewHolder(parent)

    override fun onBindViewHolder(holder: ItemViewHolder, position: Int) {
        holder.bind(getItem(position))
    }
}

class ItemComparator : DiffUtil.ItemCallback<Item>() {
    override fun areItemsTheSame(oldItem: Item, newItem: Item): Boolean {
        return oldItem.id == newItem.id
    }

    override fun areContentsTheSame(oldItem: Item, newItem: Item): Item {
        return oldItem.prop1 == newItem.prop1 &&
                oldItem.prop2 == newItem.prop2 &&
                oldItem.prop3 == newItem.prop3
    }
}
class ItemsAdapter():
ListAdapter(ItemComparator()){
重写onCreateViewHolder(父级:ViewGroup,viewType:Int)=
ItemViewHolder(父项)
覆盖BindViewHolder(holder:ItemViewHolder,位置:Int){
持有者绑定(获取项目(位置))
}
}
类ItemComparator:DiffUtil.ItemCallback(){
覆盖乐趣项相同(旧项:项,新项:项):布尔值{
返回oldItem.id==newItem.id
}
覆盖内容相同(旧项:项,新项:项):项{
返回oldItem.prop1==newItem.prop1&&
oldItem.prop2==newItem.prop2&&
oldItem.prop3==newItem.prop3
}
}
在您的活动/片段中,当您获得新页面时,只需调用
adapter.submitList(items)