RecyclerView流式布局StaggeredGridLayoutManager,重排序问题

2023-10-29

RecyclerView天然支持流式布局,只需要设置layoutManager为StaggeredGridLayoutManager,不过如果item中有图片,由于图片异步加载,会导致item布局变化,这倒也没什么,关键是在holder复用的过程中,由于图片异步加载,原先的图片尺寸与即将要加载的图片尺寸不一样,就导致上下滑动的时候,因为item默认是按照哪边有空缺,就先填充哪边,比如原本的顺序如下:
瀑布流加载图片
假如加载item10开始复用holder,则下一屏复用后如下,注意,此时图片都未加载完成
第二屏图片加载出来前
第二屏的状态下还未复服用holder8和holder9,
假设下图未图片加载完成后的状态,注意,图片加载完成后只会改变holder高度,不会重排序
第二屏图片加载完成后
现在假设我们再往回滑动,可以肯定的是,不管图片有没有缓存,滑动回顶部的时候,顶部holder一定是无法对其的。下图未滑动回顶部时holder加载状态及图片加载完成后item状态如下
滑到顶部加载状态图
左图为holder状态,图片未加载完成,注意,往上滑item是从下往上填充的,图片加载完成后如右图所示,与左图对应关系为
holder8 -> item9,
holder9 -> item8,
holder7 -> item7,
holder6 -> item6,
holder5 -> item5,
holder3 -> item4,
holder4 -> item3,
holder2 -> item2,
holder1 -> item1
但是可以看到的是此时item顺序与最初时完全不同,同时recyclerview为了确保顶部对齐,会移动item,所以会造成item移动的动画。这明显不是我们想要的。我们想要的是原来怎么样,回来还是怎么样。怎么做呢?其中一个办法就在图片加载前先确定图片尺寸,这是最简单有效的办法,也就是在holder复用时优先确定尺寸,这样原来item在什么位置,还是什么位置,图片尺寸不会变,位置不会变。
怎么做呢,使用图片框架加载图片时,在图片加载完成后,根据bitmap的宽高比计算出Imageview的尺寸,因为imageview宽度固定,所以很容易计算出需要的高度。一旦图片加载过就有尺寸信息,所有在滑动时总是能提前设置图片高度,而没加载过得图片只会是在往下加载更多图片的时候触发,而此时不需要提前知道图片尺寸,由加载完成后动态填充。因为往下滑滑到底部是不需要对齐的。而往上滑因为已经缓存了图片尺寸也能正确排序。
但是。。。。
这样做还是有概率会重排,问题出在往下滑动的时候,由于第一次不知道图片尺寸,这时候的图片排序和加载完成再回划时知道图片尺寸的排序(固定的)不一定相同。这样做只能确保加载过的图片来回滑动不会有问题。

最稳妥最完全的解决方案还是需要一开始就知道图片尺寸,然后bindHolder的时候就设置好尺寸,否则就目前看来这就是一个无解的问题
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

RecyclerView流式布局StaggeredGridLayoutManager,重排序问题 的相关文章

  • 使用DBFlow,如何加密已经存在的数据库?

    我正在使用 DBFlow 来处理项目中的数据库 并且我想对现有数据库进行加密 我知道我可能必须删除现有的未加密数据库并创建另一个加密数据库 我也知道我可以将 SQLCipher 与 DBFlow 一起使用 如上所述文档 https gith
  • Android TelecomManager 中的 addIncomingCall 没有执行任何操作

    我正在尝试使用本机 Android 来电 UI 我有一个连接服务 并且我已经成功注册了一个电话帐户 但在我调用方法 addNewIncomingCall 后什么也没有发生 对我所缺少的有什么想法吗 显现
  • Xamarin 分步向导 Android 视图

    我想在 Xamarin c 中构建一个 android 活动 用于逐步注册和 或信息 我怎样才能做这样的事情 谁能给我一个代码示例或其他东西 谢谢 基本上你需要使用一个名为 a 的元素ViewPager 并且每个页面都会不同Fragment
  • 通过代码在创建时突出显示 ListView 项目

    我想在创建 listView 时突出显示 ListView 的第一行 0 我尝试了不同的方法 就像您在注释代码中看到的那样 但没有任何效果 这很奇怪 因为 OnItemClickListener 中的突出显示工作正常 它通过 xml 选择器
  • 升级到最新支持库后Android JACK编译器错误

    Android Studio 2 2 3 Windows 10 64位 构建工具版本 25 Android Gradle插件版本2 2 3 升级到最新的支持库 从 23 4 0 到 25 1 0 并更改编译版本 从 23 到 25 后 我收
  • Android 中使用黑白 alpha 蒙版的高效位图蒙版

    我想用黑白 alpha 蒙版来掩盖位图 我的蒙版图像是黑白的 黑色区域意味着透明 白色区域意味着不透明 我需要的是 当我使用此蒙版图像来蒙版任何其他图像时 如果蒙版图像的相应区域为黑色 则生成的图像区域应为透明 否则 生成的图像区域应该是不
  • java.lang.IllegalAccessError:预验证类中的类引用在运行测试项目时解析为意外实现?

    在实施项目工作正常之后 我使用第三方库 zxing 实施了项目 然后在我编写了一个测试项目对我的项目进行单元测试之后 运行测试项目后 主项目 类及其方法没有给出任何信息错误 但如果在主项目的该方法中使用任何 zxing 框架类 则会在运行时
  • 在 Android 中加密/解密字符串的简单方法

    我的问题是如何加密String String AndroidId Override public void onCreate Bundle savedInstanceState super onCreate savedInstanceSta
  • AndEngine MenuScene - 无法单击按钮

    我有一个关于 android 和 andengine 的小问题 这是我的主菜单的源代码 AbstractScene is extending Scene public class MainMenuScene extends Abstract
  • 双屏 Android Studio 中不显示自动补全

    我刚刚从 Eclipse 切换到 Android Studio IntelliJ 我不明白自动补全是如何工作的 我尝试了 Control Space Control Shift Space 但没有相关建议 不在 Java 文件中 也不在布局
  • 了解应用程序在后台时何时收到 Firebase 消息

    我知道这个标题有同样的问题 但不幸的是它没有得到正确的回答 它被接受了 here https stackoverflow com questions 37711082 how to handle notification when app
  • 使 Recyclerview 固定高度并可滚动

    已解决以下检查答案 所以我试图为我的 Android 应用程序创建评论功能 我想在 recyclerview 中显示评论 然后在 recyclerview 下方有一个按钮和文本视图来添加评论 我想让 recyclerview 具有一定的高度
  • 如何知道我的应用程序的活动计数?

    我的应用程序中有多项活动 请考虑以下案例 Activity A 调用 Activity B B 调用 C 当用户按后退键时 C 生成通知并转到 B 现在再次按后退 因此将显示 A 再次按后退键也会终止 A 并显示通知 现在 当用户按下通知图
  • 通过 Gradle 和 Android Studio 构建和运行应用程序比通过 Eclipse 慢

    我有一个多项目 10 个模块 每次构建大约需要 20 30 秒 当我在 Android Studio 中按 运行 时 每次都必须等待才能重建应用程序 这非常慢 是否可以在 Android Studio 中自动化构建过程 或者您对如何加快此过
  • 用于请求带有临时缓存的远程 Observable 的 RxJava 模式

    用例是这样的 我想暂时缓存最新发出的昂贵的Observable响应 但在它过期后 返回到昂贵的源Observable并再次缓存它 等等 一个非常基本的网络缓存场景 但我真的很难让它工作 private Observable
  • Android ScrollView,检查当前是否滚动

    有没有办法检查标准 ScrollView 当前是否正在滚动 方向是向上还是向下并不重要 我只需要检查它当前是否正在滚动 ScrollView当前形式不提供用于检测滚动事件的回调 有两种解决方法可用 1 Use a ListView并实施On
  • 在数组列表中过滤 Filterable 不取消之前的过滤

    我看过过滤器方法文档 其中显示调用过滤器会取消所有先前未执行的过滤请求 并发布一个稍后将执行的新过滤请求 但我收到的实际回调有些不同 在我的实现中 它不会取消先前的过滤器请求并调用publishResults 最近一次搜索条件后的上一次搜索
  • 如何正确处理 ListView 内的 Android EditText 输入?

    在我的应用程序中 我有一个在 a 中添加 删除 编辑记录的活动SortedMap 该活动作为以下活动的延伸实施ListActivity 我已经实现了自定义ArrayAdapter对于收藏品 Every ListView项目 对应于基础记录
  • Android 的代码覆盖率[重复]

    这个问题在这里已经有答案了 可能的重复 Android测试代码覆盖率 Eclipse https stackoverflow com questions 3282702 android test code coverage eclipse
  • 如何用LoaderManager自动重新查询

    我有一个应用程序显示来自 SQLite DB 的数据 并且数据不断变化 所以显然 我认为我应该使用 LoaderManager 来显示数据 我读过一些关于将 LoaderManager 与 SQLite 结合使用的内容 然后看到了亚历克斯

随机推荐