如何在PagerAdapter中重写getItemPosition?重写后位置更新失效求解决
解决getItemPosition()无效及从instantiateItem()更新位置的问题
我来帮你搞定这个问题——你的getItemPosition()方法没起作用,核心原因是它的实现逻辑不符合ViewPager适配器的设计要求。下面是针对你的代码的具体修复方案:
1. 修正getItemPosition()的实现
getItemPosition()的作用是告诉适配器:传入的视图对象当前在适配器中的位置是多少。你的原有代码直接返回SharedPreferences里的值,这完全搞错了它的用法。
如果希望数据变化时所有视图都重新加载,最简单的方式是返回POSITION_NONE(表示该视图需要重新创建):
@Override public int getItemPosition(Object object) { // 让适配器重新创建所有可见视图 return POSITION_NONE; }
要是你需要更精准的更新(只刷新特定位置),可以跟踪每个视图对应的位置,再返回对应值;但对你的场景来说,返回POSITION_NONE已经足够解决问题。
2. 在instantiateItem()中直接控制ViewPager位置
如果你想在创建完item后让ViewPager跳转到该位置,根本不需要依赖getItemPosition(),直接调用ViewPager的setCurrentItem()就行。修改你instantiateItem()的最后部分:
// 保留你原有保存位置到SharedPreferences的逻辑 SharedPreferences pos = ctx.getSharedPreferences("forposition", MODE_PRIVATE); SharedPreferences.Editor poseditor = pos.edit(); poseditor.putInt("pos", position); poseditor.commit(); // 新增:直接让ViewPager跳转到当前创建的位置 if (container instanceof ViewPager) { ViewPager viewPager = (ViewPager) container; viewPager.setCurrentItem(position); } return v;
3. 触发适配器更新数据
当你修改了SharedPreferences里的array这类核心数据后,一定要调用适配器的notifyDataSetChanged()方法,这样适配器才会重新调用instantiateItem()来更新视图。比如在你的BackgroundTask执行完成后加上:
// 假设你的适配器实例是pagerAdapter pagerAdapter.notifyDataSetChanged();
为什么你的原有代码不起作用?
再给你梳理下问题根源:
- 你直接返回SharedPreferences里的
tom值,完全忽略了getItemPosition()的参数object——这个方法是要根据传入的视图对象返回它的当前位置,不是返回一个固定的目标位置 - 你调用了
super.getItemPosition(object);却没使用它的返回值,默认的POSITION_UNCHANGED表示视图位置不变,你的自定义返回值打乱了适配器的位置判断逻辑
内容的提问来源于stack exchange,提问作者Pawan Kumar singh
相关产品推荐
相关产品推荐

