Android: 重新绑定 ListView 或 RecyclerView 不刷新 Header
Android: Rebind ListView Or RecyclerView Without Refreshing Header
我需要刷新/重新绑定 ListView 或 RecyclerView 内容而不刷新 header 项目本身。
关于如何实现这一目标的任何提示?
谢谢。
是的,你可以做到。通常,您的 header 在列表中的位置为 0,因此 header 位于列表的顶部。因此,对于您的列表,例如RecyclerView
你必须初始化适配器(在 RecyclerView
的情况下你必须创建 RecyclerView.Adapter
class 的访问器)并且这个适配器有很多方法来更新适配器中的数据(notifyDataSetChanged(), notifyItemInserted()
等),您可以使用其中一种方法,具体取决于您的目的。因此,在您的情况下,您可以使用 notifyItemRangeChanged(int positionStart, int itemCount)
。
您可以在官方中找到有关这些方法的更多信息documentation
假设 header
在 position 0
:
假设您要绑定一次 header,然后在刷新后停止绑定:
当您调用 notifyDataSetChanged()
重新加载时,将再次调用适配器中的 onBindViewHolder()
方法来刷新数据,请记住这一点。您可以设置一个布尔值,以便绑定 header 一次。因此即使 onBindViewHolder()
被多次调用 header 也会绑定一次。
class Adapter extends ...........{
//use a boolean as a flag
private boolean bindHeader = true;
........
.......
.......
@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
..........
if(position == 0 && bindHeader){
//bind the header only for the first time
......
......
//then stop binding after refresh
bindHeader = false;
}else if(position > 0){
//bind the reset of the items here
}
}
..............
..............
}
我需要刷新/重新绑定 ListView 或 RecyclerView 内容而不刷新 header 项目本身。
关于如何实现这一目标的任何提示?
谢谢。
是的,你可以做到。通常,您的 header 在列表中的位置为 0,因此 header 位于列表的顶部。因此,对于您的列表,例如RecyclerView
你必须初始化适配器(在 RecyclerView
的情况下你必须创建 RecyclerView.Adapter
class 的访问器)并且这个适配器有很多方法来更新适配器中的数据(notifyDataSetChanged(), notifyItemInserted()
等),您可以使用其中一种方法,具体取决于您的目的。因此,在您的情况下,您可以使用 notifyItemRangeChanged(int positionStart, int itemCount)
。
您可以在官方中找到有关这些方法的更多信息documentation
假设 header
在 position 0
:
假设您要绑定一次 header,然后在刷新后停止绑定:
当您调用 notifyDataSetChanged()
重新加载时,将再次调用适配器中的 onBindViewHolder()
方法来刷新数据,请记住这一点。您可以设置一个布尔值,以便绑定 header 一次。因此即使 onBindViewHolder()
被多次调用 header 也会绑定一次。
class Adapter extends ...........{
//use a boolean as a flag
private boolean bindHeader = true;
........
.......
.......
@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
..........
if(position == 0 && bindHeader){
//bind the header only for the first time
......
......
//then stop binding after refresh
bindHeader = false;
}else if(position > 0){
//bind the reset of the items here
}
}
..............
..............
}