ViewPager的刷新、限制预加载、缓存所有
【框架】:

公共部分:左侧菜单、TitleBar、RadioGroup(3个RadioButton:X、Y、Z)
选择X页面:指示器+ViewPager
【要达成的效果】:
(1)左侧选择A,进入X页面,X1联网刷新页面,此时禁止X2预加载—>滑动到X2页面,X2才联网刷新—>X3—>X4;
(2)从X4再滑到X3、X2、X1时,X1、X2、X3不需要再次刷新,假设停留在X2页面;
(3)左侧再点选择B,或者先点Y再点选择B再点X,这时候X2联网刷新;
(4)X2页面滑到X1、X3、X4页面,X1、X3、X4重新刷新一次并缓存。
【需要解决的几个问题及说明】:
需要解决:
(1)ViewPager的Fragment刷新问题
(2)禁止ViewPager的预加载问题
(3)加载后即缓存,除非再次联网请求
说明:
因为抽取了BaseFragment、联网加载页面LoadingPage等,代码结构有点复杂,这里只摘取跟本文相关的代码
【1】刷新问题
initData初始化:
fManager=getChildFragmentManager();
adapter = new MyViewPagerAdapter(fManager,fenleiFragments);
vpSearch.setAdapter(adapter);
vpSearch.setOffscreenPageLimit(fenleiFragments.size()-1);//设置缓存所有
FragmentPagerAdapter:
class MyViewPagerAdapter extends FragmentPagerAdapter {
private ArrayList<Fragment> fragments;
private FragmentManager manager;
private int mChildCount=0;
public MyViewPagerAdapter(FragmentManager fm, ArrayList<Fragment> fenleiFragments) {
super(fm);
this.manager=fm;
this.fragments=fenleiFragments;
}
@Override
public void notifyDataSetChanged() {
mChildCount=getCount();
super.notifyDataSetChanged();
}
@Override
public Fragment getItem(int position) {
return fenleiFragments.get(position);
}
@Override
public int getCount() {
return fenleiFragments == null ? 0 : fenleiFragments.size();
}
@Override
public CharSequence getPageTitle(int position) {
return fenlei_names.get(position);
}
@Override
public void destroyItem(ViewGroup container, int position, Object object) {
super.destroyItem(container, position, object);
}
@Override
public int getItemPosition(Object object) {
//方式1:
if(mChildCount>0){
mChildCount--;
return POSITION_NONE;
}
return super.getItemPosition(object);
//方式2:
//return POSITION_NONE;
/*备注:方式1和方式2在只有3个Fragment的情况下,效果一样,多于3个的情况没有验证*/
}
}
收到广播刷新
左侧菜单更换选择,刷新菜单更换选择、等等,这里用广播的方式通知刷新
//注册为广播接收者
private LocalBroadcastManager lbm;
private BroadcastReceiver selectChangedReceiver=new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
//更新页面(适配器)
/*----------------------------------------------------------------*/
if(vpSearch.getAdapter()!=null){
FragmentManager cfm = getChildFragmentManager();
FragmentTransaction ft = cfm.beginTransaction();
List<Fragment> fragments = cfm.getFragments();
if(fragments!=null && fragments.size()>0){
for(int i = 0; i < fragments.size(); i++) {
ft.remove(fragments.get(i));
}
}
ft.commit();
}
fenleiFragments.clear();
fenleiFragments.add(new CategoryFragment(Urls.getFenleiUrl(0)));
fenleiFragments.add(new BrandFragment(Urls.getFenleiUrl(1)));
fenleiFragments.add(new DongtaiFragment(Urls.getFenleiUrl(2)));
adapter.notifyDataSetChanged();
/*----------------------------------------------------------------*/
}
};
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//注册广播接收
lbm = LocalBroadcastManager.getInstance(getActivity());
lbm.registerReceiver(selectChangedReceiver,new IntentFilter(BroadcastVar.SELECT_CHANGED));
}
@Override
public void onDestroy() {
super.onDestroy();
if(lbm!=null){
lbm.unregisterReceiver(selectChangedReceiver);
selectChangedReceiver=null;
}
}
【2】取消ViewPager预加载
主要修改BaseFragment
属性添加2个
private int isLoad=0;//是否已经加载过
private boolean isVisable;//是否可见
修改updateLoadingPage的getMyUrl()方法
public String getMyUrl() {
if(TextUtils.isEmpty(getUrl())){//本身就不需要联网
isLoad=1;
return getUrl();
}else{
if(isVisable){//需要联网,可见
isLoad=2;
return getUrl();
}else{//需要联网,不可见
isLoad=3;
return null;
}
}
}
重写setUserVisibleHint方法
public void setUserVisibleHint(boolean isVisibleToUser) {
super.setUserVisibleHint(isVisibleToUser);
isVisable=isVisibleToUser;
if(isVisibleToUser && isLoad==3){
//这时候loadingPage一定不为null,因为isLoad==3表示已经初始化过
loadingPage.show();
}
}
注意initData解析json的处理
JSONObject jsonObject = JSON.parseObject(content);
if(jsonObject==null){//因为为了防止ViewPager预加载的时候手动将url置为了空,需要校验一下
return;
}
【3】缓存所有Fragment
vpSearch.setOffscreenPageLimit(fenleiFragments.size()-1);
另外FragmentPagerAdapter一定要按照上面的写法。
ViewPager的刷新、限制预加载、缓存所有的更多相关文章
- Android中ViewPager+Fragment取消(禁止)预加载延迟加载(懒加载)问题解决方案
转载请注明出处:http://blog.csdn.net/linglongxin24/article/details/53205878本文出自[DylanAndroid的博客] Android中Vie ...
- ViewPager+Fragment,Fragment会预加载的问题
http://www.bubuko.com/infodetail-535920.html 在Fragmetn里,onCreateView去加载布局,真正的加载数据通过这个方法setUserVisibl ...
- 防止ViewPager和Fragment结合使用时候的数据预加载
不知道你们使用ViewPager和Fragment结合的时候发现一个问题没,如果你的每个Fragment都需要请求网络数据,并且你在请求网络数据的时候会加入进度对话框的加载显示效果,当你显示第一个Fr ...
- ViewPager+Fragment取消预加载(延迟加载)(转)
原文:http://www.2cto.com/kf/201501/368954.html 在项目中,都或多或少地使用的Tab布局,所以大都会用到ViewPager+Fragment,但是Fragmen ...
- viewpager和fragment预加载的解决
在使用Viewpager和fragment处理中会出现预加载的问题,最近看别人的代码,终于找到了一个很好的处理方法 能有效的解决预加载的问题,在fragment都继承一个重写setUserVisibl ...
- 关于禁止ViewPager预加载问题【转】
转自:http://blog.csdn.net/qq_21898059/article/details/51453938#comments 我最近上班又遇到一个小难题了,就是如题所述:ViewPage ...
- ViewPager+Fragment取消预加载(延迟加载)
在项目中,都或多或少地使用的Tab布局,所以大都会用到ViewPager+Fragment,但是Fragment有个不好或者太好的地方.例如你在ViewPager中添加了三个Fragment,当加载V ...
- 实现app上对csdn的文章列表上拉刷新下拉加载以及加入缓存文章列表的功能 (制作csdn app 四)
转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/23698511 今天继续对我们的csdn客户端未完成的功能进行实现,本篇博客接着客 ...
- viewpager处理(三):让viewpager不预加载下一页
有时候viewpager加载页面的时候,我们发现页面的数据量很大,预加载的话会消耗性能,为了节省用户流量和手机性能,所以我们想让viewpager不自动预加载下一页,怎么实现呢? viewpager预 ...
随机推荐
- atitit。wondows 右键菜单的管理与位置存储
atitit.wondows 右键菜单的管理与位置存储 原理 .这样的功能称为Windows外壳扩展(Shell Extensions) 1 常用右键菜单 atiContentMenu1 通用tool ...
- jquery的html,text,val
.html()用为读取和修改元素的HTML标签 .text()用来读取或修改元素的纯文本内容 .val()用来读取或修改表单元素的value值. 这三个方法功能上的对比 .html(),.text() ...
- 使用__slots__限定实例的成员列表
使用__slots__限定实例的成员列表 默认情况下,python对象队象的每个实例(instance)都会有一个字典来存储该实例的属性,这样做的好处在于运行时期每个对象可以任意设置新的属性.而相对应 ...
- 利用奇异值分解(SVD)简化数据
特征值与特征向量 下面这部分内容摘自:强大的矩阵奇异值分解(SVD)及其应用 特征值分解和奇异值分解在机器学习领域都是属于满地可见的方法.两者有着很紧密的关系,在接下来会谈到,特征值分解和奇异值分解的 ...
- Form的enctype="multipart/form-data"作用
<form class="form-horizontal" role="form" method="post" action=&quo ...
- 学习WPF——使用Font-Awesome图标字体
图标字体介绍 在介绍图标字体之前,不得不介绍图标格式ICON ICON是一种图标格式,我们操作系统中各种应用程序都包含一个图标 比如QQ程序的图标是一个可爱的企鹅,我的电脑是一个显示器图标 ----- ...
- NYOJ995硬币找零(简单dp)
/* 题意:给你不同面额的硬币(每种硬币无限多),需要找零的面值是T,用这些硬币进行找零, 如果T恰好能被找零,输出最少需要的硬币的数目!否则请输出剩下钱数最少的找零方案中的最少硬币数! 思路:转换成 ...
- 哈夫曼树(一)之 C语言详解
本章介绍哈夫曼树.和以往一样,本文会先对哈夫曼树的理论知识进行简单介绍,然后给出C语言的实现.后续再分别给出C++和Java版本的实现:实现的语言虽不同,但是原理如出一辙,选择其中之一进行了解即可.若 ...
- Robot Framework自动化测试(六)--- robotremoteserver使用
robotremoteserver 是什么? Python Remote Server for Robot Framework 下载地址:https://pypi.python.org/pypi/ro ...
- Azure China (6) SAP 应用在华登陆 Windows Azure 公有云
<Windows Azure Platform 系列文章目录> 2014年07月11日 由世纪互联运营的 Windows Azure 为 SAP 应用提供公有云平台 2014 年 ...