PagerAdapter 正确地移除 Item

本文探讨了在使用 PagerAdapter 时遇到的问题,包括如何正确实现 getItemPosition 方法以避免显示错误,以及理解 getItemId 方法对于防止Fragment复用的重要性。此外,还解释了FragmentPagerAdapter使用detach而不是remove Fragment的原因,以及这种方式对内存管理和页面复用的影响。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

引子

很久没有写 UI 相关的程序,感觉都生疏了。最近用 FragmentPagerAdapter,配合 TabLayout,感觉还不错。不过很快就遇到了一个问题,我把 Adapter 里面的数据清空之后,再换一批进去,发现展示的 fragment总是有问题。为什么呢?

PagerAdapter 的 getItemPosition 方法

我们做 Android 这么多年,大家肯定比较熟悉这个套路,就是返回 item 的位置嘛。如果没有这个 item 呢?我们通常也习惯性的返回一个 -1,表示没有,这样做,也与很多 api 的设计的习惯一致:

 
 
  1. public int indexOf(Object o) {

  2.    ...

  3.    return -1;

  4. }

例如 ArrayList.indexOf 这个方法,如果找不到这个元素,那么就返回一个 -1

所以我们在实现 PagerAdaptergetItemPosition 时很自然的想到这么写:

 
 
  1. override fun getItemPosition(item : Any?): Int {

  2.    return items.indexOf(item)

  3. }

看上去没有什么,一副人畜无害的样子。如果是在 ListView 或者 RecyclerView 当中这么写,应该没有什么问题,可偏偏这里是 PagerAdapter

我们来看下这个方法的注释:

 
 
  1. /**

  2. * @return object's new position index from [0, {@link #getCount()}),

  3. *         {@link #POSITION_UNCHANGED} if the object's position has not changed,

  4. *         or {@link #POSITION_NONE} if the item is no longer present.

  5. */

  6. public int getItemPosition(Object object) {

  7.    return POSITION_UNCHANGED;

  8. <

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值