ViewPager使用FragmentPagerAdapter加载多个fragment,实现对已加载的list做插入、删除及排序操作
2017-01-23 10:34
736 查看
ViewPager使用FragmentPagerAdapter加载多个fragment,实现对已加载的list做插入、删除及排序操作。 例子1:
List<Fragment> list = new ArrayList<>(); list.add(fragment1); list.add(fragment2); list.add(fragment3); adapter = new MyListAdapter(list,fragmentManager); viewpager.setAdapter(adapter); //删除fragment2 list.remove(fragment2); adapter.notifyDataSetChanged();
执行上面代码是没任何改变的,因为在调用adapter.notifyDataSetChanged()时adapter会通过getItemPosition(Object object) 来判断是否删除fragment:
通过重写getItemPosition:
@Override public int getItemPosition(Object object) { //每次都刷新都调用instantiateItem 和destroyItem方法 return POSITION_NONE; }
再次执行例子1,viewpager是有改变的但是不是期望的效果,继续看源码:
而getItemId(position)方法默认返回的是
到这里可以发现instantiateItem()新增fragment是通过position创建一个name然后在 fragmentManager中查询是否存在改name的fragment,存在就调用attch方法重新加载(这 里与destroyItem方法的detach对于的,attch会重新创建View)。 所以例子1删除fragment2时,list的size为2,调用notifyDataSetChanged, adapter会删除所有的fragemnt调用instantiateItem重新添加,在创健fragment的name时 默认返回position,所以剩下两个的name是以position为0、1的tag,viewpager显示的 是fragment1、fragment2,而不是fragment1、fragment3。
接下来MyFragmentPagerAdapter:
public abstract class MyFragmentPagerAdapter extends PagerAdapter{
private final FragmentManager mFragmentManager;
private FragmentTransaction mCurTransaction = null;
private Fragment mCurrentPrimaryItem = null;
public MyFragmentPagerAdapter(FragmentManager mFragmentManager){
this.mFragmentManager =mFragmentManager;
}
public abstract Fragment getItem(int position);
/**作为fragment的标识,每个fragment都有单独的标识,不能直接用position,否则在排序和删除会出现fragment错乱*/
public abstract long getItemId(int position);
@Override
public void startUpdate(ViewGroup container) {
}
@Override
public Object instantiateItem(ViewGroup container, int position) {
if (mCurTransaction == null) {
mCurTransaction = mFragmentManager.beginTransaction();
}
final long itemId = getItemId(position);
String name = makeFragmentName(container.getId(), itemId);
Fragment fragment = mFragmentManager.findFragmentByTag(name);
if (fragment != null) {
/** mCurTransaction.attach(fragment);
* 用show、hide代替attach、detach,这样fragment不会reCreateView
*/
mCurTransaction.show(fragment);
} else {
fragment = getItem(position);
mCurTransaction.add(container.getId(), fragment,
makeFragmentName(container.getId(), itemId));
}
if (fragment != mCurrentPrimaryItem) {
fragment.setMenuVisibility(false);
fragment.setUserVisibleHint(false);
}
return fragment;
}
@Override
public void destroyItem(ViewGroup container, int position, Object object) {
if (mCurTransaction == null) {
mCurTransaction = mFragmentManager.beginTransaction();
}
/** mCurTransaction.detach((Fragment)object);*/
mCurTransaction.hide((Fragment)object);
}
@Override
public void setPrimaryItem(ViewGroup container, int position, Object object) {
Fragment fragment = (Fragment)object;
if (fragment != mCurrentPrimaryItem) {
if (mCurrentPrimaryItem != null) {
mCurrentPrimaryItem.setMenuVisibility(false);
mCurrentPrimaryItem.setUserVisibleHint(false);
}
if (fragment != null) {
fragment.setMenuVisibility(true);
fragment.setUserVisibleHint(true);
}
mCurrentPrimaryItem = fragment;
}
}
@Override public int getItemPosition(Object object) { //每次都刷新都调用instantiateItem 和destroyItem方法 return POSITION_NONE; }
@Override
public void finishUpdate(ViewGroup container) {
if (mCurTransaction != null) {
mCurTransaction.commitAllowingStateLoss();
mCurTransaction = null;
mFragmentManager.executePendingTransactions();
}
}
@Override
public boolean isViewFromObject(View view, Object object) {
return ((Fragment)object).getView() == view;
}
@Override
public Parcelable saveState() {
return null;
}
@Override
public void restoreState(Parcelable state, ClassLoader loader) {
}
private static String makeFragmentName(int viewId, long id) {
return "android:switcher:" + viewId + ":" + id;
}
}
用法和FragmentPagerAdapter一样,将getItemId改为抽象方法,返回每个fragment的标识。
相关文章推荐
- 在viewpager中使用FragmentPagerAdapter实现分页
- 使用ViewPager和FragmentPagerAdapter实现Tab
- Android ViewPager的FragmentPagerAdapter中Fragment不重新加载数据,并且使用的是其他缓存的Framgnet的问题
- viewpager和以及在viewpager中使用FragmentPagerAdapter实现分页
- Android viewpager+fragment实现动态加载碎片(fragment重复使用)
- ViewPager + FragmentPagerAdapter 实现底Tab的预加载问题。
- 使用 ViewPagerIndicator + FragmentPagerAdapter 实现 tab 切换
- Android Tab -- 使用ViewPager、Fragment、FragmentPagerAdapter来实现
- ViewPager+Fragment实现Tabhost,动态添加删除Fragment,可供第三方使用的类库
- viewpager和以及在viewpager中使用FragmentPagerAdapter实现分页
- ViewPager+FragmentPagerAdapter实现Tab/模仿微信界面(推荐使用)
- Android仿微信界面--使用FragmentPagerAdapter,viewpager实现(慕课网笔记)
- ViewPager+Fragment实现Tabhost,动态添加删除Fragment,可供第三方使用的类库
- 使用JAVA实现单链表的建立、测长、打印、删除、插入、排序、逆置
- 使用FragmentTabHost+Fragment+viewpager 实现滑动分页
- 使用ViewPager和Fragment实现滑动导航
- 使用javascript操作多选列表框,实现动态增加删除,左右移动,上下排序移动等功能。
- 页面滑动2:使用FragmentPagerAdapter(ViewPagerDemo2)
- 使用ViewPager+Fragment来实现带滚动条的多屏滑动-IndicatorFragmentActivity
- 【安卓笔记】使用ViewPager+Fragment实现选项卡切换效果