0
项目中的问题,viewpager加载少量的图片,然后刷到最后一页,把图片模糊展示,点击一个按钮之后,加载大量图片,并且要把模糊的图片变得清晰,我用了Adapter.notifyDataSetChanged(),虽然会使图片增多,但是模糊的图片并不会变得清晰
1
viewpager不同于listview和recycleView,单纯的调用notifyDataSetChanged方法,并不会刷新页面
因为viewpager的刷新过程是这样的:在每次调用notifyDataSetChanged()时,都会激活getItemPosition(Object object)方法,该方法会遍历viewpager的所有item,为每个item返回一个状态值(POSITION_NONE/POSITION_UNCHANGED),如果是none,那么该item会被destroyItem(ViewGroup container, int position, Object object)方法remove掉,然后重新加载,如果是unchanged,就不会重新加载,默认是unchanged,所以如果我们不重写getItemPosition(Object object),就无法看到刷新效果。
2
解决方案一
重写PagerAdapter的getItemPosition(Object object)方法,使其返回POSITION_NONE
@Override
public int getItemPosition(Object object) {
return POSITION_NONE;
}
但是不需要刷新的也重新刷新了,有点浪费,所以要多做一些事:在instantiateItem时给每个view加上tag,然后在需要刷新页面时通过View.getTag()来判断是否是我们想要刷新的页面,只给当前页面返回POSITION_NONE。
//这里本来是可以用setTag(Object tag)的但是后边我用了Glide 这个方法和Glide有冲突
//无奈改为两个参数的 第一参数是一个int值 但不能随便传 必须是资源id 这个资源ID我随便穿的 没发现什么问题
PhotoView imageView = new PhotoView(container.getContext());
imageView.setTag(R.id.account, position);
@Override
public int getItemPosition(Object object) {
View view = (View) object;
int currentPagerIdx = ((DetailsActivity) activity).getCurrentPagerIdx();
if (currentPagerIdx == (Integer) view.getTag(R.id.account)) {
return POSITION_NONE;
} else {
return POSITION_UNCHANGED;
}
}
getCurrentPagerIdx是我那个activity里自己写的方法
public int getCurrentPagerIdx(){
return vpDetails.getCurrentItem();
}
大致就这些了 韦昕同学等她妹妹 一直在闪我的微信 我要继续爆她俩的照