加载更多数据后如何在 RecyclerView 中恢复到之前的状态
How to restore to the previous state in RecyclerView after loading more data
我使用 RecyclerView 已经有一段时间了。我遵循延迟加载,所以我每次都在视图上显示 10 个数据。如果用户滚动到底部,页面会从顶部重新加载!但是,我想留在以前的地方!所以,我尝试使用
recyclerView.scrollToPosition(position);
然而,这打破了 UI 流程!
我的第二次尝试是使用 onSaveInstanceState() 和 onRestoreInstanceState(Bundle state); 但是,这不起作用!我的页面重新加载到顶部!
Parcelable state = layoutManager.onSaveInstanceState();
layoutManager.onRestoreInstanceState(state);
我已经尝试了所有其他方法,显然 none 对我有用!
任何帮助将不胜感激!提前致谢!
注意:确保您没有在每次更新数据集后都初始化或调用 setAdapter() 方法。如果没有,那么
您必须更新您的数据列表并调用 notifyDataSetChanged() 这将从现有位置更新您的适配器。
假设您已将数据存储到 ArrayList mData;
您的 getItemCount() 将是
@Override
public int getItemCount() {
if (mData != null && mData.length() > 0)
return mData.size();
return 0;
}
现在在您的适配器中再创建一个方法,您每次从服务器获取新数据时都会调用该方法。此方法将简单地覆盖您的数据集并更新您的适配器
private void updateDataSet(ArrayList<String> mData){
this.mData = mData;
notifyDataSetChanged();
}
这是 Recycler View 到 recycle/resuse 视图的默认行为。如官方文档所示:
https://developer.android.com/reference/android/support/v7/widget/RecyclerView.html
如果您遇到任何与视图相关的问题,请将您的视图状态保存在 List<Object>
中,例如为每个位置设置可见项或不可见项。并在您的 onBindViewHolder
方法中根据位置 show/hide 您的观点。
我在 2 天前完成了此功能
我和你分享我的想法
制作
Listview lv; //Assume Find view by Id
List<Model> models = new ArrayList();
现在制作适配器并分配空白模型
CustomAdapter adapter = new CustomeAdapter(context,models);
lv.setAdapter(adapter);
现在当您有新数据要使用 lazylodaing 加载时
这样做
models.addAll(newModels); //new ModelList
adapter.notifyDataSetChanged();
就是这样。
我使用 RecyclerView 已经有一段时间了。我遵循延迟加载,所以我每次都在视图上显示 10 个数据。如果用户滚动到底部,页面会从顶部重新加载!但是,我想留在以前的地方!所以,我尝试使用
recyclerView.scrollToPosition(position);
然而,这打破了 UI 流程! 我的第二次尝试是使用 onSaveInstanceState() 和 onRestoreInstanceState(Bundle state); 但是,这不起作用!我的页面重新加载到顶部!
Parcelable state = layoutManager.onSaveInstanceState();
layoutManager.onRestoreInstanceState(state);
我已经尝试了所有其他方法,显然 none 对我有用! 任何帮助将不胜感激!提前致谢!
注意:确保您没有在每次更新数据集后都初始化或调用 setAdapter() 方法。如果没有,那么
您必须更新您的数据列表并调用 notifyDataSetChanged() 这将从现有位置更新您的适配器。
假设您已将数据存储到 ArrayList mData;
您的 getItemCount() 将是
@Override
public int getItemCount() {
if (mData != null && mData.length() > 0)
return mData.size();
return 0;
}
现在在您的适配器中再创建一个方法,您每次从服务器获取新数据时都会调用该方法。此方法将简单地覆盖您的数据集并更新您的适配器
private void updateDataSet(ArrayList<String> mData){
this.mData = mData;
notifyDataSetChanged();
}
这是 Recycler View 到 recycle/resuse 视图的默认行为。如官方文档所示:
https://developer.android.com/reference/android/support/v7/widget/RecyclerView.html
如果您遇到任何与视图相关的问题,请将您的视图状态保存在 List<Object>
中,例如为每个位置设置可见项或不可见项。并在您的 onBindViewHolder
方法中根据位置 show/hide 您的观点。
我在 2 天前完成了此功能
我和你分享我的想法
制作
Listview lv; //Assume Find view by Id
List<Model> models = new ArrayList();
现在制作适配器并分配空白模型
CustomAdapter adapter = new CustomeAdapter(context,models);
lv.setAdapter(adapter);
现在当您有新数据要使用 lazylodaing 加载时
这样做
models.addAll(newModels); //new ModelList
adapter.notifyDataSetChanged();
就是这样。