重写ViewPager实施单一交有关切换到这个问题,并没有缓存

简介:

我们需要解决这个问题:切换时,可以实现单独的消息到左和右,但我不知道的情况下根据岗位总数。只是不知道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

版权声明:本文博主原创文章,博客,未经同意不得转载。






本文转自mfrbuaa博客园博客,原文链接:http://www.cnblogs.com/mfrbuaa/p/4882506.html,如需转载请自行联系原作者


相关文章
|
缓存 NoSQL Redis
REDIS02_基于SpringBoot+Mybatis+Redis重写Redis的序列化的缓存实战(七)
REDIS02_基于SpringBoot+Mybatis+Redis重写Redis的序列化的缓存实战(七)
132 0
REDIS02_基于SpringBoot+Mybatis+Redis重写Redis的序列化的缓存实战(七)
|
缓存 NoSQL Redis
REDIS02_基于SpringBoot+Mybatis+Redis重写Redis的序列化的缓存实战(六)
REDIS02_基于SpringBoot+Mybatis+Redis重写Redis的序列化的缓存实战(六)
161 0
REDIS02_基于SpringBoot+Mybatis+Redis重写Redis的序列化的缓存实战(六)
|
缓存 NoSQL Redis
REDIS02_基于SpringBoot+Mybatis+Redis重写Redis的序列化的缓存实战(五)
REDIS02_基于SpringBoot+Mybatis+Redis重写Redis的序列化的缓存实战(五)
127 0
|
缓存 NoSQL Redis
REDIS02_基于SpringBoot+Mybatis+Redis重写Redis的序列化的缓存实战(四)
REDIS02_基于SpringBoot+Mybatis+Redis重写Redis的序列化的缓存实战(四)
147 0
|
缓存 NoSQL Redis
REDIS02_基于SpringBoot+Mybatis+Redis重写Redis的序列化的缓存实战(三)
REDIS02_基于SpringBoot+Mybatis+Redis重写Redis的序列化的缓存实战(三)
140 0
|
缓存 NoSQL Redis
REDIS02_基于SpringBoot+Mybatis+Redis重写Redis的序列化的缓存实战(二)
REDIS02_基于SpringBoot+Mybatis+Redis重写Redis的序列化的缓存实战(二)
118 0
|
缓存 NoSQL Redis
REDIS02_基于SpringBoot+Mybatis+Redis重写Redis的序列化的缓存实战(一)
REDIS02_基于SpringBoot+Mybatis+Redis重写Redis的序列化的缓存实战(一)
118 0
|
4天前
|
消息中间件 缓存 NoSQL
Redis经典问题:缓存雪崩
本文介绍了Redis缓存雪崩问题及其解决方案。缓存雪崩是指大量缓存同一时间失效,导致请求涌入数据库,可能造成系统崩溃。解决方法包括:1) 使用Redis主从复制和哨兵机制提高高可用性;2) 结合本地ehcache缓存和Hystrix限流降级策略;3) 设置随机过期时间避免同一时刻大量缓存失效;4) 使用缓存标记策略,在标记失效时更新数据缓存;5) 实施多级缓存策略,如一级缓存失效时由二级缓存更新;6) 通过第三方插件如RocketMQ自动更新缓存。这些策略有助于保障系统的稳定运行。
131 1
|
7天前
|
存储 消息中间件 缓存
Redis缓存技术详解
【5月更文挑战第6天】Redis是一款高性能内存数据结构存储系统,常用于缓存、消息队列、分布式锁等场景。其特点包括速度快(全内存存储)、丰富数据类型、持久化、发布/订阅、主从复制和分布式锁。优化策略包括选择合适数据类型、设置过期时间、使用Pipeline、开启持久化、监控调优及使用集群。通过这些手段,Redis能为系统提供高效稳定的服务。