安卓开发:GridView无限滚动下按返回键如何保持位置并同步数据
安卓GridView图库场景异常问题解决方案
问题1:自定义返回逻辑后GridView回到顶部
- 根因:你大概率在自定义
onBackPressed方法中调用了startActivity重新启动列表页Activity,或是在列表页的onResume生命周期中每次都重新初始化Adapter、重新加载图片数据,导致页面完全重绘回到顶部。 - 解决步骤:
- 图片详情页返回列表页不要调用
startActivity,直接调用finish()关闭详情页即可,系统会自动回到栈内的上一个列表页实例,不会触发重建。 - 列表页的图片数据查询、
GridView.setAdapter()逻辑仅放在onCreate中执行一次,不要放到onStart/onResume里重复执行。 - 如需兼容特殊场景下的滚动位置保存,可在列表页跳转详情页前记录当前位置:
后续刷新数据后调用int scrollPosition = gridView.getFirstVisiblePosition();gridView.setSelection(scrollPosition)即可回到之前的浏览位置。 - 图片详情页返回列表页不要调用
问题2:删除图片后列表仍显示已删条目
- 根因:删除图片的操作仅修改了本地存储的文件,没有更新GridView绑定的
Adapter的数据源,也没有通知Adapter数据发生变更,列表不会自动刷新。 - 解决步骤:
- 采用
startActivityForResult(或新版Activity Result API)启动详情页,删除操作完成后调用setResult将被删除的图片路径/ID等信息回传给列表页。 - 列表页在结果回调中拿到被删除的图片信息后,先从Adapter的数据源List中移除对应条目,再调用
adapter.notifyDataSetChanged()通知GridView刷新,已删除条目就会自动消失。 - 如需适配批量删除场景,也可以在返回列表页时重新查询一次系统媒体库的图片列表,替换掉Adapter的旧数据源后再调用刷新,配合之前保存的滚动位置调用
setSelection,可以做到既刷新数据又不回到顶部。
- 采用
内容的提问来源于stack exchange,提问作者Ambreen Zubari
相关产品推荐
相关产品推荐

