Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/image/5.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
Android 如何防止方向更改后在StaggedGridLayoutManager中重新排序项目?_Android_Image_Android Recyclerview_Picasso_Staggeredgridlayout - Fatal编程技术网

Android 如何防止方向更改后在StaggedGridLayoutManager中重新排序项目?

Android 如何防止方向更改后在StaggedGridLayoutManager中重新排序项目?,android,image,android-recyclerview,picasso,staggeredgridlayout,Android,Image,Android Recyclerview,Picasso,Staggeredgridlayout,我知道这个问题听起来和StackOverflow上的其他问题很相似,但这是关于方向改变后的具体情况 我有一个带有工具栏和RecyclerView的活动。我使用带有垂直方向和3列的交错边缘布局管理器来填充RecyclerView。项目布局是包含ImageView和TextView的线性布局 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_p

我知道这个问题听起来和StackOverflow上的其他问题很相似,但这是关于方向改变后的具体情况

我有一个带有工具栏和RecyclerView的活动。我使用带有垂直方向和3列的交错边缘布局管理器来填充RecyclerView。项目布局是包含ImageView和TextView的线性布局

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="@dimen/grid_item_margin"
android:orientation="vertical">

<ImageView
    android:id="@+id/image"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:scaleType="centerCrop" />

<TextView
    android:id="@+id/text"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:paddingBottom="2dp"
    android:paddingTop="2dp" />
</LinearLayout>
假设我的适配器中有50个项目。我处于纵向模式,向下滚动20个项目。然后我切换到横向模式。我现在创建了一个新的StaggedGridLayoutManager,它有4列,因此比纵向模式多了一列。我重新计算图像高度以适应新的目标宽度,并在布局上设置保存状态,如下所示:

ArrayList<ImageInfo> imageInfos = savedInstanceState
    .getParcelableArrayList(IMG_INFOS_KEY);
setNewImgTargetDimensions(imageInfos, columns);
mAdapter = new ImageGridAdapter(mPicasso, imageInfos);
mRecyclerView.setAdapter(mAdapter);
mRecyclerView.setLayoutManager(layoutMgr);
Parcelable sglmState = savedInstanceState
    .getParcelable(LAYOUT_MGR_STATE_KEY);
mRecyclerView.getLayoutManager()
    .onRestoreInstanceState(sglmState);
ArrayList imageInfos=savedInstanceState
.getParcelableArrayList(IMG_信息键);
设置新的ImgTargetDimensions(图像信息、列);
mAdapter=新的ImageGridAdapter(mPicasso,imageInfos);
mRecyclerView.setAdapter(mAdapter);
mRecyclerView.setLayoutManager(layoutMgr);
可包裹sglmState=savedInstanceState
.getParcelable(布局\管理\状态\键);
mRecyclerView.getLayoutManager()
.onRestoreInstanceState(sglmState);
网格自动滚动到所需的存储位置。现在我向上滚动。由于新的图像尺寸,“滚动位置上方的空间”不能完全由图像填充。因此,项目会被重新排序,但大多数情况下,网格顶部仍或多或少存在较大的差距(请参见底部的屏幕截图链接)。最糟糕的是当我跳到最高点的时候。那么,在这种情况下,有没有办法防止重新排序和缺口呢

第一次加载时显示屏幕

方向更改后向上滚动时显示屏幕。左边的图像几乎是透明的,因为我猜是自定义淡入动画。我将其从示例代码中删除,以使其更小

编辑:


我刚刚意识到,在方向改变后,所有项目都在屏幕顶部对齐。虽然这看起来不错,但我更希望回收器视图顶部的对齐方式是正确的。

因此我想出了一个解决方法。简而言之,当网格一直滚动到顶部时,我将间距策略设置为
gap\u HANDLING\u MOVE\u ITEMS\u inter\u span
,以便重新排列项目


下面是更详细的描述。当使用保存的实例状态调用onActivityCreated时,我检查方向是否已更改。如果有,我会设置一个标志。在
onScrollStateChanged
回调中,我检查第一个可见的项目位置是否为0。这就是我认为的“滚动到顶部”。因此,如果用户滚动到顶部,并且方向发生了变化,我将调用
layoutMgr.setGapStrategy(staggeedgridlayoutmanager.GAP\u HANDLING\u MOVE\u ITEMS\u interval\u span)
layoutMgr.invalidateSpanAssignments()(并重置标志)。

您是否解决了此问题?我也有类似的问题。我使用Glide从内部存储器加载许多图像。然后我向下滚动到视图的中心或末端,旋转设备,当我滚动到顶部时,我会看到间隙。我看到的不是3列中的图像,而是一列(2列为空)。有什么帮助吗?
ArrayList<ImageInfo> imageInfos = savedInstanceState
    .getParcelableArrayList(IMG_INFOS_KEY);
setNewImgTargetDimensions(imageInfos, columns);
mAdapter = new ImageGridAdapter(mPicasso, imageInfos);
mRecyclerView.setAdapter(mAdapter);
mRecyclerView.setLayoutManager(layoutMgr);
Parcelable sglmState = savedInstanceState
    .getParcelable(LAYOUT_MGR_STATE_KEY);
mRecyclerView.getLayoutManager()
    .onRestoreInstanceState(sglmState);