我有一个关于Android的RecyclerView的问题。状态
我正在使用RecyclerView,如何使用它并将其与RecyclerView绑定。状态
我的目的是保存RecyclerView的滚动位置。
您计划如何使用RecyclerView保存上次保存的职位。州
?
你可以一直依靠良好的保存状态。扩展回收视图,覆盖onSaveInstanceState()和onRestoreInstanceState():
@Override
protected Parcelable onSaveInstanceState() {
Parcelable superState = super.onSaveInstanceState();
LayoutManager layoutManager = getLayoutManager();
if(layoutManager != null && layoutManager instanceof LinearLayoutManager){
mScrollPosition = ((LinearLayoutManager) layoutManager).findFirstVisibleItemPosition();
}
SavedState newState = new SavedState(superState);
newState.mScrollPosition = mScrollPosition;
return newState;
}
@Override
protected void onRestoreInstanceState(Parcelable state) {
super.onRestoreInstanceState(state);
if(state != null && state instanceof SavedState){
mScrollPosition = ((SavedState) state).mScrollPosition;
LayoutManager layoutManager = getLayoutManager();
if(layoutManager != null){
int count = layoutManager.getItemCount();
if(mScrollPosition != RecyclerView.NO_POSITION && mScrollPosition < count){
layoutManager.scrollToPosition(mScrollPosition);
}
}
}
}
static class SavedState extends android.view.View.BaseSavedState {
public int mScrollPosition;
SavedState(Parcel in) {
super(in);
mScrollPosition = in.readInt();
}
SavedState(Parcelable superState) {
super(superState);
}
@Override
public void writeToParcel(Parcel dest, int flags) {
super.writeToParcel(dest, flags);
dest.writeInt(mScrollPosition);
}
public static final Parcelable.Creator<SavedState> CREATOR
= new Parcelable.Creator<SavedState>() {
@Override
public SavedState createFromParcel(Parcel in) {
return new SavedState(in);
}
@Override
public SavedState[] newArray(int size) {
return new SavedState[size];
}
};
}
店内
lastFirstVisiblePosition = ((LinearLayoutManager)rv.getLayoutManager()).findFirstCompletelyVisibleItemPosition();
恢复
((LinearLayoutManager) rv.getLayoutManager()).scrollToPosition(lastFirstVisiblePosition);
如果这不管用,试试看
((LinearLayoutManager) rv.getLayoutManager()).scrollToPositionWithOffset(lastFirstVisiblePosition,0)
将存储放入onPause()
并在onResume()中还原
从recyclerview:1.2.0-alpha02
releaseStateRestorationPolicy
开始引入。这可能是解决给定问题的更好方法。
android开发者的媒体文章已经介绍了这个话题。
此外,@rubén-viguera在下面的回答中分享了更多细节。https://stackoverflow.com/a/61609823/892500
如果您正在使用LinearLayoutManager,它附带了预构建的保存api linearLayoutManagerInstance.onSaveInstanceState()和恢复api linearLayoutManagerInstance.onRestoreInstanceState(...)
这样,你就可以把退回的包裹保存到你的外站。例如。,
outState.putParcelable("KeyForLayoutManagerState", linearLayoutManagerInstance.onSaveInstanceState());
,并使用保存的状态恢复恢复位置。例如,
Parcelable state = savedInstanceState.getParcelable("KeyForLayoutManagerState");
linearLayoutManagerInstance.onRestoreInstanceState(state);
总而言之,您的最终代码如下所示
private static final String BUNDLE_RECYCLER_LAYOUT = "classname.recycler.layout";
/**
* This is a method for Fragment.
* You can do the same in onCreate or onRestoreInstanceState
*/
@Override
public void onViewStateRestored(@Nullable Bundle savedInstanceState) {
super.onViewStateRestored(savedInstanceState);
if(savedInstanceState != null)
{
Parcelable savedRecyclerLayoutState = savedInstanceState.getParcelable(BUNDLE_RECYCLER_LAYOUT);
recyclerView.getLayoutManager().onRestoreInstanceState(savedRecyclerLayoutState);
}
}
@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putParcelable(BUNDLE_RECYCLER_LAYOUT, recyclerView.getLayoutManager().onSaveInstanceState());
}
编辑:您也可以在GridLayoutManager中使用相同的apis,因为它是LinearLayoutManager的子类。谢谢@wegsehen的建议。
编辑:请记住,如果您也在后台线程中加载数据,则需要在onPostExecute/onLoadFinished方法中调用onRestoreInstanceState,以便在方向更改时恢复位置,例如:。
@Override
protected void onPostExecute(ArrayList<Movie> movies) {
mLoadingIndicator.setVisibility(View.INVISIBLE);
if (movies != null) {
showMoviePosterDataView();
mDataAdapter.setMovies(movies);
mRecyclerView.getLayoutManager().onRestoreInstanceState(mSavedRecyclerLayoutState);
} else {
showErrorMessage();
}
}
在中,
我有一个包含水平回收视图的具有底部表行为的碎片。回收视图由SnapHelper调整以实现页面效果。它看起来像这样: 在片段中的onCreateView事件中,我设置了Adapter和LayoutManager: 在我设置适配器之后,在MyRecycorAdapter类对象中触发onCreateViewHolder事件,然后是onBindViewHolder: 当我第一次创建这个片段并配置Recyc
我做了一个水平循环视图,效果很好(多亏了这个),但滚动和数据的方向是从左向右扩展的;那么,我该如何更改RecyclerView滚动方向,如下图所示? 我的代码:
为主机、硬盘、镜像资源提供回收站功能。避免资源误删除导致数据丢失。 为了避免因为删除误操作而导致的数据丢失风险,云管平台提供了回收站功能。回收站用于临时存放用户删除的主机(包括虚拟机和裸金属)、硬盘、镜像文件。回收站功能仅支持管理员用户使用,普通用户不可见。 虚拟机 主机回收站用于存放用户删除的虚拟机和裸金属文件。 硬盘 硬盘回收站用于存放用户删除的硬盘文件。 镜像 镜像回收站用于存放用户删除的镜
已删除的文件/文件夹/团队空间将统一进入到回收站,可以从回收站对文件进行恢复或者彻底删除。
回收站包含已删除的表和任何关联的对象如索引、约束、嵌套表。在主窗口中,点击 “其他”->“回收站”来打开回收站的对象列表。 还原一个表 在对象选项卡选择一个表。 点击 “闪回表”。 移除一个对象 在对象选项卡选择一个要清除的对象。 点击 “清除对象”。 在对话窗口中确认删除。 移除全部对象 右击对象选项卡的任意位置并在弹出式菜单中选择“清除回收站”。 在对话窗口中确认删除。 移除每个用户的全部对象