emmmmm.....
在实际项目中遇到了一个需求,就是点击按钮要改变viewpager中的fragment,而经过尝试 -0- 发现FragmentPagerAdapter中的notifydatasetchanged()并不能起到什么作用...
通过对fragmentpageadapter的源码查看你会在instantiateItem方法里面发现这一段
// Do we already have this fragment?
String name = makeFragmentName(container.getId(), position);
Fragment fragment = mFragmentManager.findFragmentByTag(name);
if (fragment != null) {
if (DEBUG) Log.v(TAG, "Attaching item #" + position + ": f=" + fragment);
mCurTransaction.attach(fragment);
} else {
fragment = getItem(position);
if (DEBUG) Log.v(TAG, "Adding item #" + position + ": f=" + fragment);
mCurTransaction.add(container.getId(), fragment,
makeFragmentName(container.getId(), position));
}
原来他会先去FragmentManager里面去查找有没有相关的fragment如果有就直接使用如果没有才会触发fragmentpageadapter的getItem方法获取一个fragment。所以你更新的fragmentList集合是没有作用的,还要清除FragmentManager里面缓存的fragment。解决办法:在继承的fragmentpageadapter类里面添加一个方法:
import android.support.annotation.NonNull;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentPagerAdapter;
import android.support.v4.app.FragmentStatePagerAdapter;
import android.support.v4.app.FragmentTransaction;
import java.util.ArrayList;
import java.util.List;
public class MainViewpagerAdapter extends FragmentStatePagerAdapter {
private List<Fragment> fragments;
private FragmentManager fm;
public MainViewpagerAdapter(FragmentManager fm, List<Fragment> fragments) {
super(fm);
this.fm = fm;
this.fragments = fragments;
}
@Override
public Fragment getItem(int position) {
return fragments.get(position);
}
@Override
public int getCount() {
return fragments.size();
}
@Override
public int getItemPosition(@NonNull Object object) {
return POSITION_NONE;//复写pageradapter的getItemPosition方法设置tag为POSITION_NONE意思是没有找到child要求重新加载。
}
/**
* 移除fragments中的数据然后再重新添加fragment
*
* @param newFragments
*/
public void setFragments(ArrayList<Fragment> newFragments) {
if (fragments != null) {
FragmentTransaction ft = fm.beginTransaction();
for (Fragment f : fragments) {
ft.remove(f);
}
ft.commit();
ft = null;
fm.executePendingTransactions();
}
fragments = newFragments;
notifyDataSetChanged();
}
}