引子
很久没有写 UI 相关的程序,感觉都生疏了。最近用 FragmentPagerAdapter
,配合 TabLayout
,感觉还不错。不过很快就遇到了一个问题,我把 Adapter 里面的数据清空之后,再换一批进去,发现展示的 fragment
总是有问题。为什么呢?
PagerAdapter 的 getItemPosition 方法
我们做 Android 这么多年,大家肯定比较熟悉这个套路,就是返回 item 的位置嘛。如果没有这个 item 呢?我们通常也习惯性的返回一个 -1,表示没有,这样做,也与很多 api 的设计的习惯一致:
public int indexOf(Object o) {
...
return -1;
}
例如 ArrayList.indexOf
这个方法,如果找不到这个元素,那么就返回一个 -1
。
所以我们在实现 PagerAdapter
的 getItemPosition
时很自然的想到这么写:
override fun getItemPosition(item : Any?): Int {
return items.indexOf(item)
}
看上去没有什么,一副人畜无害的样子。如果是在 ListView
或者 RecyclerView
当中这么写,应该没有什么问题,可偏偏这里是 PagerAdapter
。
我们来看下这个方法的注释:
/**
* @return object's new position index from [0, {@link #getCount()}),
* {@link #POSITION_UNCHANGED} if the object's position has not changed,
* or {@link #POSITION_NONE} if the item is no longer present.
*/
public int getItemPosition(Object object) {
return POSITION_UNCHANGED;
<