上来先谈需求,好像整的我跟产品似的。我可不是产品**,嘿嘿!但是没有办法,有需要才有实现,有实现才有问题,有问题才有我的总结。这文采牛逼不牛逼。
问题1:
需求:点击图片实现查看大图,可以左右切换
顶部是标题栏(左中右的顺序):返回键,标题(当前图片位置/图片总数),更多按钮
中间是图片
底部是底部导航栏:其实只有一个下载按钮
这个只是我需求的大致样貌,我真正的需求是:点击更多按钮弹出dialog(保存,删除),就是删除功能。
如果只有一张图,删除之后推出当前页面返回上一页
如果是多张图,删除最后一张图,选择前一张;删除中间页图片,选择下一张。
好的,就是这么个需求。又很简单是不是?
实现:删除的时候,将图片集合移除该图片url,传回到adapter,调用notifyDataSetChanged();
是不是?是不是?你么就说是不是?
不是!!!!!!!没有任何作用。为啥子呢?没办法,看源代码!
/**
PagerAdapter
* This method should be called by the application if the data backing this adapter has changed
* and associated views should update.
*/
public void notifyDataSetChanged() {
synchronized (this) {
if (mViewPagerObserver != null) {
mViewPagerObserver.onChanged();
}
}
mObservable.notifyChanged();
}
从上述方法可以看出:底层采用的是观察者模式,但是mViewPagerObserver是什么呢?
PagerAdpapter的方法
void setViewPagerObserver(DataSetObserver observer) {
synchronized (this) {
mViewPagerObserver = observer;
}
}
从上述方法可以看出,mViewPagerObserver是在这个方法赋值。那这个方法又是在哪里调用的呢?
ViewPager的方法
/**
* Set a PagerAdapter that will supply views for this pager as needed.
*
* @param adapter Adapter to use
*/
public void setAdapter(@Nullable PagerAdapter adapter) {
if (mAdapter != null) {
mAdapter.setViewPagerObserver(null);
mAdapter.startUpdate(this);
for (int i = 0; i < mItems.size(); i++) {
final ItemInfo ii = mItems.get(i);
mAdapter.destroyItem(this, ii.position, ii.object);
}
mAdapter.finishUpdate(this);
mItems.clear();
removeNonDecorViews();
mCurItem = 0;
scrollTo(0, 0);
}