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一定要按照上面的写法。

时间: 2024-10-05 04:09:19

ViewPager的刷新、限制预加载、缓存所有的相关文章

Oracle Coherence中文教程二十:预加载缓存

预加载缓存 本章介绍了不同的模式,你可以用它来预加载缓存.该模式包括批量装载和分布载荷. 本章包含以下各节: 执行批量加载和处理 执行分布式批量加载 20.1执行批量加载和处理 例20-5, PagedQuery.java ,演示了在一个连贯缓存技术,有效地批量加载和处理项目. 20.1.1批量写入缓存 使用连贯性时,一个常见的场景是预先填充缓存应用程序使用它之前.一个简单的方法来做到这例20-1中的Java代码所示: 例20-1预加载缓存 public static void bulkLoad

关于ViewPager的适配器之——pagerAdapter加载缓存页面的机制

ViewPager有很多的适配器,如pagerAdapter,FragmentPagerAdapter等, 今天我想重点谈的是关于pagerAdapter加载缓存页面的机制的问题. 首先,使用pagerAdapter一般需要重写它的四个未实现的方法分别是: 1.  getCount(){} //得到总数 2.    //实例化页面,  相当于BaseAdapter等适配器中的 getView()方法 返回想要显示的对象(内容) // 不同之处是:这里需要把这些对象(内容)一一添加到adapter

android 禁止viewpager预加载

ViewPager这个控件相信每一个做android的都用过,而且一定用过,viewpager是可以前后滑动的,这在很多app中引导页中用过,大家也知道它是带缓存的,现在新建一个项目 viewpagertest, package com.example.viewpagertest; import java.util.ArrayList; import android.app.Activity; import android.os.Bundle; import android.os.IBinder

图片预加载的问题-----有针对加载和缓存的兼容解决

网站开发时经常需要在某个页面需要实现对大量图片的浏览,如果考虑流量的话,大可以像pconline一样每个页面只显示一张图片,让用户每看一张图片就需要重新下载一下整个页面.不过,在web2.0时代,更多人愿意用javascript来实现一个图片浏览器,让用户无需等待过长的时间就能看到其他图片. 知道了一张图片的地址,需要把它在一个固定大小的html容器(可以是div等)里边显示出来,最重要的当然是需要知道这张即将显示的图片的宽和高,然后再结合容器的宽和高,按照一定的缩放比例使图片显示出来.因此,实

去除预加载的Viewpager

package com.example.zhbj_heima47.view; /* * Copyright (C) 2011 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtai

ViewPager和Fragment的综合使用的预加载机制

混合使用的适配器: FragmentPagerAdapter   FragmentStatePagerAdapter(Fragment数据动态性较大.占用内存较多的时候) ViewPager的预加载:ViewPager 会默认预先初始化当前页面的左右相邻页面,它的预先加载页面数量默认是 1 , 并且是private的不可以修改,这样做的好处是左右滑动会比较流畅. 懒加载:即让ViewPager预加载初始化UI,而具体一些数据,网络访问请求等延迟加载.这是靠Fragment里有一个 setUser

ViewPager+Fragment取消预加载(延迟加载)

在项目中,都或多或少地使用的Tab布局,所以大都会用到ViewPager+Fragment,但是Fragment有个不好或者太好的地方.例如你在ViewPager中添加了三个Fragment,当加载ViewPager中第一个Fragment时,它会默认帮你预先加载了第二个Fragment,当你加载第二个Fragment时,它会帮你加载第三个Fragment.这样虽然有时很好,但是用户只需看一个Fragment时,我们就做了一些多余工作加载了第二个Fragment.在这只需要取消Fragment的

安卓权威编程指南 挑战练习 24章 预加载以及缓存

24.7 挑战练习:预加载以及缓存 应用中并非所有任务都能即时完成,对此,大多用户表示理解.不过,即使是这样,开发者们也一直在努力做到最好.为了让应用反应更快,大多数现实应用都通过以下两种方式增强自己的代码:? 增加缓存层 ? 预加载图片 缓存指存储一定数目 Bitmap 对象的地方.这样,即使不再使用这些对象,它们也依然存储在那里. 缓存的存储空间有限,因此,在缓存空间用完的情况下,需要某种策略对保存的对象做一定的取舍.许多缓存机制使用一种叫作LRU(least recently used,最

ViewPager预加载机制

ViewPager加载图片控件: ViewPager会默认加载当前页和当前页的左右两页. 一开始当前页是下标0,所以一开始默认加载第0页(指下标,下同)和第1页. 当你向右滑动,当前页为第1页时,ViewPager会加载第2页,这时一共有3页存在(第0,1,2页). 再向右滑动,当前页为第2页时,会移除第0页,加载第3页,同理向左滑动当前页为第1页时,会移除第3页. 所以我们可以通过这个原理使ViewPager始终只加载3页的图片. 如何实现呢? 只需在在PagerAdapter中的instan