今天在弄ViewPager 其中被FragmentPagerAdapter搞死了 一直更新不了数据 看了很多网上的文章 都不能满足我的需求 然后看到了这篇文章 分享下
摘要
在使用ViewPager+FragmentPagerAdapter时候,更新Fragment里数据是不起作用,FragmentPagerAdapter添加或减少Fragment时,前面的Fragment内容更新不起作用等等问题,有的做法是暴力删除fragment列表,如
List<Fragment> fragments = getSupportFragmentManager().getFragments();
for (int i = fragments.size() - 1; i >= 0; i--) {
getSupportFragmentManager().beginTransaction().remove(fragments.get(0));
}
也有做法是重写FragmentPagerAdapter的instantiateItem(ViewGroup container, int position)方法等等,有效虽有效,但比较粗爆。
FragmentPagerAdapter.getItem(int position)在更新时候不一定会被调用,所以Fragment更新是无效,来看看FragmentPagerAdapter的父类PagerAdapter中的代码instantiateItem
@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;
}
FragmentPagerAdapter里在根据getItemId(int position)来判断当前position里Fragment是否存在,如果存在,则不会创建亦不会更新,那么要让FragmentPagerAdapter的更新生效,那在getItemId(int)里根据数据返回一个唯一的数据ID,当FragmentPagerAdapter更新时,数据ID改变了,那么Fragment就会调用getItem(int)去获取新Fragment,达到更新效果
@Override
public long getItemId(int position) {
// 获取当前数据的hashCode
int hashCode = fragments.get(position).hashCode();
return hashCode;
}
在adapter加了上面代码后,效果就出来了。被搞死了,我已经用尽洪荒之力了,要死了