重写ViewPager实现单个帖子进入左右切换和不缓存问题
2014-10-29 09:46
288 查看
需要解决问题:单个帖子进入时候可以实现左右切换,并且是在不知道帖子总数的情况下,就是不知道ViewPagerAdapter的getCount数量。
由于帖子内容的数据图片和布局比较复杂,所以不让ViewPager缓存,否则消耗内存太大。
重写ViewPager
public class LazyViewPager extends ViewGroup {
private boolean isCanScroll = true;
public boolean isCanScroll() {
return isCanScroll;
}
public void setCanScroll(boolean isCanScroll) {
this.isCanScroll = isCanScroll;
}
private static final String TAG = "LazyViewPager";
private static final boolean DEBUG = false;
private static final boolean USE_CACHE = false;
<span style="color:#ff0000;">private static final int DEFAULT_OFFSCREEN_PAGES = 0;//默认的加载页面,ViewPager是1个,所以会加载两个Fragment</span>
private static final int MAX_SETTLE_DURATION = 600; // ms
重写ViewPager的setAdapter可以实现单个帖子指定跳转到的页数
public void setAdapter(PagerAdapter adapter,int position) {
if (mAdapter != null) {
mAdapter.unregisterDataSetObserver(mObserver);
mAdapter.startUpdate(this);
for (int i = 0; i < mItems.size(); i++) {
final ItemInfo ii = mItems.get(i);
mAdapter.destroyItem(this, ii.position, ii.object);
}
mAdapter.finishUpdate(this);
mItems.clear();
removeAllViews();
mCurItem = 0;
scrollTo(0, 0);
}
mAdapter = adapter;
if (mAdapter != null) {
if (mObserver == null) {
mObserver = new PagerObserver();
}
mAdapter.registerDataSetObserver(mObserver);
mPopulatePending = false;
if (mRestoredCurItem >= 0) {
mAdapter.restoreState(mRestoredAdapterState, mRestoredClassLoader);
<span style="color:#ff0000;"> if(position>0){
setCurrentItemInternal(position, false, true);
}else{
setCurrentItemInternal(mRestoredCurItem, false, true);
}</span>
mRestoredCurItem = -1;
mRestoredAdapterState = null;
mRestoredClassLoader = null;
} else {
populate(position);
}
}
}
不过前提是设置这个ViewPager的Adapter的getCount的数量为1000或者Integer.Max
如果要实现ViewPager的Fragment不重复执行onCreateView方法,需要重写destroyItem
private class MyFragmentAdapter extends FragmentPagerAdapter{
public MyFragmentAdapter(FragmentManager fm) {
super(fm);
// TODO Auto-generated constructor stub
}
@Override
public Fragment getItem(int arg0) {
// TODO Auto-generated method stub
MyFragment fragment = new MyFragment(arg0);
return fragment;
}
@Override
public int getCount() {
// TODO Auto-generated method stub
return 10;
}
@Override
public void destroyItem(ViewGroup container, int position, Object object) {
// TODO Auto-generated method stub
// super.destroyItem(container, position, object);
}
@Override
public void destroyItem(View container, int position, Object object) {
// TODO Auto-generated method stub
// super.destroyItem(container, position, object);
}
}
如果要设置ViewPager实现左右无限切换,可以通过重写Adapter的getItem()方法,
@Override
public Fragment getItem(int arg0) {
// TODO Auto-generated method stub
MyFragment fragment = fragments.get(arg0%4);
return fragment;
}
前提是getCount是个很大的数
复制去Google翻译翻译结果
新MyFragment(为arg0)
由于帖子内容的数据图片和布局比较复杂,所以不让ViewPager缓存,否则消耗内存太大。
重写ViewPager
public class LazyViewPager extends ViewGroup {
private boolean isCanScroll = true;
public boolean isCanScroll() {
return isCanScroll;
}
public void setCanScroll(boolean isCanScroll) {
this.isCanScroll = isCanScroll;
}
private static final String TAG = "LazyViewPager";
private static final boolean DEBUG = false;
private static final boolean USE_CACHE = false;
<span style="color:#ff0000;">private static final int DEFAULT_OFFSCREEN_PAGES = 0;//默认的加载页面,ViewPager是1个,所以会加载两个Fragment</span>
private static final int MAX_SETTLE_DURATION = 600; // ms
重写ViewPager的setAdapter可以实现单个帖子指定跳转到的页数
public void setAdapter(PagerAdapter adapter,int position) {
if (mAdapter != null) {
mAdapter.unregisterDataSetObserver(mObserver);
mAdapter.startUpdate(this);
for (int i = 0; i < mItems.size(); i++) {
final ItemInfo ii = mItems.get(i);
mAdapter.destroyItem(this, ii.position, ii.object);
}
mAdapter.finishUpdate(this);
mItems.clear();
removeAllViews();
mCurItem = 0;
scrollTo(0, 0);
}
mAdapter = adapter;
if (mAdapter != null) {
if (mObserver == null) {
mObserver = new PagerObserver();
}
mAdapter.registerDataSetObserver(mObserver);
mPopulatePending = false;
if (mRestoredCurItem >= 0) {
mAdapter.restoreState(mRestoredAdapterState, mRestoredClassLoader);
<span style="color:#ff0000;"> if(position>0){
setCurrentItemInternal(position, false, true);
}else{
setCurrentItemInternal(mRestoredCurItem, false, true);
}</span>
mRestoredCurItem = -1;
mRestoredAdapterState = null;
mRestoredClassLoader = null;
} else {
populate(position);
}
}
}
不过前提是设置这个ViewPager的Adapter的getCount的数量为1000或者Integer.Max
如果要实现ViewPager的Fragment不重复执行onCreateView方法,需要重写destroyItem
private class MyFragmentAdapter extends FragmentPagerAdapter{
public MyFragmentAdapter(FragmentManager fm) {
super(fm);
// TODO Auto-generated constructor stub
}
@Override
public Fragment getItem(int arg0) {
// TODO Auto-generated method stub
MyFragment fragment = new MyFragment(arg0);
return fragment;
}
@Override
public int getCount() {
// TODO Auto-generated method stub
return 10;
}
@Override
public void destroyItem(ViewGroup container, int position, Object object) {
// TODO Auto-generated method stub
// super.destroyItem(container, position, object);
}
@Override
public void destroyItem(View container, int position, Object object) {
// TODO Auto-generated method stub
// super.destroyItem(container, position, object);
}
}
如果要设置ViewPager实现左右无限切换,可以通过重写Adapter的getItem()方法,
@Override
public Fragment getItem(int arg0) {
// TODO Auto-generated method stub
MyFragment fragment = fragments.get(arg0%4);
return fragment;
}
前提是getCount是个很大的数
复制去Google翻译翻译结果
新MyFragment(为arg0)
相关文章推荐
- 重写ViewPager实施单一交有关切换到这个问题,并没有缓存
- ViewPager实现首次进入软件时左右滑屏的软件展示效果
- Android之ActionBar、Tabs、Fragment、ViewPager实现标签页切换并缓存页面
- android中viewPager实现的屏幕左右切换(入门篇)
- Android:使用ViewPager实现左右滑动切换图片(图上有点点)
- Android 实现多页界面左右滑动切换效果之入门+进阶 (ViewPager+PagerAdapter)
- ViewPager example -实现左右两个屏幕的切换
- android中viewPager+fragment实现的屏幕左右切换(进阶篇)
- Android使用ViewPager实现左右切换(转)
- Android 利用ViewPager实现底部圆点导航左右滑动效果以及Fragment页面切换
- ViewPager---ViewPager example -实现左右两个屏幕的切换
- ViewPager example -实现左右两个屏幕的切换
- ViewPager-实现左右两个屏幕的切换
- ViewPager example -实现左右两个屏幕的切换
- android ViewPager实现页面左右切换效果
- 使用viewpager嵌套实现上下左右滑动切换图片(IOS双向滚动翻页效果相同)
- 使用viewpager嵌套实现上下左右滑动切换图片
- ViewPager实现首次进入软件时左右滑屏的软件展示效果
- Android之ActionBar、Tabs、Fragment、ViewPager实现标签页切换并缓存页面
- android中viewPager+fragment实现的屏幕左右切换(进阶篇)