在viewpager和fragment配合使用的时候,有时候我们会实现微信浏览图片的那种效果,就是浏览大图的时候会想删除其中一张图片,这个是时候我们
uris.remove(currPosition % uris.size()); mFragmentAdapter.notifyDataSetChanged();发现确实是删除了一个页面但是有一个问题出现,那就是删除非最后一张图片时,删除的不是我们想要的,被删除依旧在。这是怎么回事呢?
查看源码发现:
@Override public Object instantiateItem(ViewGroup container, int position) { if (mCurTransaction == null) { mCurTransaction = mFragmentManager.beginTransaction(); } final long itemId = getItemId(position); // Do we already have this fragment? String name = makeFragmentName(container.getId(), itemId); Fragment fragment = mFragmentManager.findFragmentByTag(name); if (fragment != null) { if (DEBUG) Log.v(TAG, "Attaching item #" + itemId + ": f=" + fragment); mCurTransaction.attach(fragment); } else { fragment = getItem(position); if (DEBUG) Log.v(TAG, "Adding item #" + itemId + ": f=" + fragment); mCurTransaction.add(container.getId(), fragment, makeFragmentName(container.getId(), itemId)); } if (fragment != mCurrentPrimaryItem) { fragment.setMenuVisibility(false); fragment.setUserVisibleHint(false); } return fragment; }查看代码加粗的部分,就会发现,这里是用了缓存机制,当fragmentmanager.findFragmentByTag(...)不为空时,使用的是之前加载的fragment,不会创建新的fragment,
看到这里就明朗了,只要让他拿到的是新的
final long itemId = getItemId(position); // Do we already have this fragment? String name = makeFragmentName(container.getId(), itemId);,再看getItemId();
public long getItemId(int position) { return position; }找到原因了,我们只要让其id不唯一不就行了,
在你的adapter中重写getItemId,大功告成!!!
我的实现方法
@Override public long getItemId(int position) { return uris.get(position).hashCode(); }url保证唯一,用其hashCode做id