android保存用户自定义排序,android – 如何在方向更改后阻止StaggeredGridLayoutManager中的项目重新排序?...

我知道这个问题与StackOverflow上的其他问题听起来类似,但这是关于在方向改变后发生的事情.

我有一个带有工具栏和RecyclerView的Activity.我使用具有垂直方向和3列的StaggeredGridLayoutManager来填充RecyclerView.项目布局是包含ImageView和TextView的LinearLayout.

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:layout_margin="@dimen/grid_item_margin"

android:orientation="vertical">

android:id="@+id/image"

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:scaleType="centerCrop" />

android:id="@+id/text"

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:paddingBottom="2dp"

android:paddingTop="2dp" />

图像从网络加载.我知道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个项目.然后我改为横向模式.我创建了一个新的StaggeredGridLayoutManager,现在有4列,所以比纵向模式多一个.我重新计算图像高度以适应新的目标宽度,并在布局上设置保存状态,如下所示:

ArrayList 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显示了方向更改后向上滚动的屏幕.左边的图像几乎是透明的,因为我猜想自定义淡入淡出动画.我从示例代码中删除了它以使其更小.

编辑:

我刚刚意识到方向改变后所有项目都在屏幕顶部对齐.虽然看起来不错,但我更倾向于回收者视图顶部的对齐是否合适.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值