【发布时间】:2015-08-04 10:06:14
【问题描述】:
我知道这个问题听起来与 StackOverflow 上的其他问题相似,但这是专门针对方向更改后发生的情况。
我有一个带有工具栏和 RecyclerView 的 Activity。我使用具有垂直方向和 3 列的 StaggeredGridLayoutManager 来填充 RecyclerView。项目布局是一个包含 ImageView 和 TextView 的 LinearLayout。
<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>
图像是从网络加载的。我知道 ViewHolders 绑定之前的图像大小。所以我在 onBindViewHolder 中设置了图像高度,以防止项目重新排序并通过 Picasso 加载图像:
@Override
public void onBindViewHolder(ViewHolder holder, int position) {
ViewGroup.LayoutParams lp = holder.imageView.getLayoutParams();
lp.height = imageInfos.get(position).imageHeight;
holder.imageView.setLayoutParams(lp);
mPicasso.load(url)
.noFade()
.into(holder.imageView); // imageView scaleType=centerCrop
}
假设我的适配器中有 50 个项目。我处于纵向模式并向下滚动 20 个项目。然后我切换到横向模式。我现在创建了一个有 4 列的新 StaggeredGridLayoutManager,所以比纵向模式多一列。我重新计算图像高度以适应新的目标宽度并在布局上设置保存状态,如下所示:
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);
网格会自动滚动到所需的存储位置。现在我向上滚动。由于新的图像尺寸,“滚动位置上方的空间”不能完全被图像填充。所以项目会重新排序,但大多数时候网格顶部仍然或多或少有很大的差距(请参阅底部的屏幕截图链接)。当我飞到顶部时,这是最糟糕的。那么有没有办法防止这种情况下的重新排序和间隙?
portrait mode 在第一次加载时显示屏幕。
landscape mode 在方向更改后向上滚动时显示屏幕。左边的图像几乎是透明的,因为我猜是自定义的动画淡入淡出。我从示例代码中删除了它以使其更小。
编辑:
我刚刚意识到在方向更改后所有项目都在屏幕顶部对齐。虽然看起来不错,但我希望回收站视图顶部的对齐方式正确。
【问题讨论】:
-
这个问题你解决了吗?我有类似的问题。我使用 Glide 从内部存储中加载了许多图像。然后我向下滚动到视图的中心或到最后,旋转设备,当我滚动到顶部时,我看到了间隙。而不是 3 列中的图像,我只看到一列(2 列是空的)。有什么帮助吗?
标签: android image android-recyclerview picasso staggeredgridlayout