在自定义adapter继承PagerAdapter的时候,一般只会实现instantiateItem()、destroyItem()、isViewFromObject()、getCount()这几个方法,这样在数据源不变的情况下,ViewPager展现是没有问题的,但是当数据变化了,ViewPager需要增加或减少item的时候,通常会调用adapter的notifyDataSetChanged()方法,这时候就会有问题了,ViewPager可能不会有任何改变。
这时候,adapter还需要实现getItemPosition()方法,这个方法返回的是一个int值,默认为POSITION_UNCHANGED(-1),如果不重载这个方法,adapter默认一直返回POSITION_UNCHANGED,ViewPager.dataSetChanged()会根据这个方法的返回值,来判断是否调用PagerAdapter.instantiateItem()方法,如果是POSITION_UNCHANGED,instantiateItem()将一直不会调用,所以adapter.notifyDataSetChanged()没有任何效果。
只需要在adapter中重载getItemPosition(),返回POSITION_NONE(-2)即可,这样,再数据改变后,adapter.notifyDataSetChanged()就可以正常修改ViewPager里面item的值了。
adapter = new PagerAdapter() {
@Override
public int getCount() {
return 1;
}
@Override
public boolean isViewFromObject(View view, Object object) {
return view == object;
}
@Override
public Object instantiateItem(ViewGroup container, int position) {
return view;
}
/*
* 解决viewpager在刷新调用notifyDataSetChanged不起作用 使用懒加载后没有效果?
*/
public int getItemPosition(Object object) {
return POSITION_NONE;
}
@Override
public void destroyItem(ViewGroup container, int position, Object object) {
container.removeView((View) object);
}
};