android viewpager更新数据,Android-ViewPager+Fragment数据更新问题(示例代码)

当使用ViewPager结合FragmentPagerAdapter时,由于内部缓存,调用notifyDataSetChanged()无法更新Fragment内容。文章介绍了两种解决方法:1) 重写getItemPosition(),效率较低;2) 通过设置并查找Tag来更新特定Fragment。同时提供了一个BaseFragmentPagerAdapter抽象类,要求Fragment实现UpdateAble接口以简化更新过程。
摘要由CSDN通过智能技术生成

由于FragmentPagerAdapter内部存在缓存。因此调用notifyDataSetChanged()并不可以去更新Fragment的内容。

能够有两种解决的方法:

(1)重写Adapter的getItemPosition():

public int getItemPosition(Object object) {

return POSITION_NONE;

}当调用notifyDataSetChanged()的时候。ViewPager会remove掉全部的view,然后又一次去载入。可行,可是效率低。

(2)在view上调用SetTag。然后用ViewPager.findViewWithTag()来找到要更新的view,然后做更新。

由于FragmentPagerAdapter内部缓存Fragment的时候,已经是依照tag的方式缓存的,因此。在更新的时候,我们仅仅要依据tag,拿到fragment,然后去更新fragment就能够了。

看下FragmentPagerAdapter的instantiateItem()方法:

public Object instantiateItem(ViewGroup container, int position)

{

if (this.mCurTransaction == null) {

this.mCurTransaction = this.mFragmentManager.beginTransaction();

}

long itemId = getItemId(position);

String name = makeFragmentName(container.getId(), itemId);//这里就是在生成fragment的tag

Fragment fragment = this.mFragmentManager.findFragmentByTag(name);//这里是依据tag查找

if (fragment != null)

{

this.mCurTransaction.attach(fragment);//找到直接attch

} else {

fragment = getItem(position);//找不到的时候。才会调用getItem

this.mCurTransaction.add(container.getId(), fragment, makeFragmentName(container.getId(), itemId));

}

if (fragment != this.mCurrentPrimaryItem) {

fragment.setMenuVisibility(false);

fragment.setUserVisibleHint(false);

}

return fragment;

}依据原代码我们能够知道系统给每个Fragment都打上了一个标签,通过标签来寻找对应的fragment,所以当我们第二次进入fragment的时候。fragment的oncreate,oncreateView方法都不会被调用的。由于FragmentPageAdapter中的getitem()方法根本不会被调用,由于系统会依据标签找到对应的fragment。假设已经存在,就不会被调用,fragment有一个缓存机制在这里。

如今的问题是必需要做更新,那么能够这么弄:

public class FragmentViewPagerAdapter extends FragmentPagerAdapter {

private FragmentManager mFragmentManager;

private List mDatas;

private List tagList = new ArrayList();

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值