(4.0.23.4)Android之取消ViewPage+Fragment的预加载 2015


viewpager.setOffscreenPageLimit(limit)  设置预加载个数;默认1; 设0无效  
在这个方法中处理下载数据;

每个fragment中复写下边的方法:
        @Override
        public void setUserVisibleHint(boolean isVisibleToUser) {
                // TODO Auto-generated method stub
                if (isVisibleToUser) {
                        //fragment可见时加载数据
        } else {
            //不可见时不执行操作
        }
                super.setUserVisibleHint(isVisibleToUser);
        }



[mw_shl_code=java,true]@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
        super.setUserVisibleHint(isVisibleToUser);// 每次切换fragment时调用的方法
        if (isVisibleToUser) {
                showData();
        }
}[/mw_shl_code]
@Override
public void onResume() {
        super.onResume();
        if (getUserVisibleHint()) {// 判断当前fragment是否显示
                showData();
                        
        }
}


 

Android之取消ViewPage+Fragment的预加载

用过ViewPage+Fragment组合的童鞋自然知道这个问题,没有遇到的同学祝愿你们永远不会遇到,呵呵。直接上关键代码

注释:setUserVisibleHint每次fragment显示与隐藏都会调用,他的调用顺序由于onCreate,所以需要一些常量进行判断

1
2
3
4
5
6
7
8
9
10
11
12
13
private  boolean  mHasLoadedOnce =  false ;
@Override
     public  void  setUserVisibleHint( boolean  isVisibleToUser) {
         if  ( this .isVisible()) {
             // we check that the fragment is becoming visible
             if  (isVisibleToUser && !mHasLoadedOnce && mArrayList== null ) {
                 
                                 // async http request here
                 mHasLoadedOnce =  true ;
             }
         }
         super .setUserVisibleHint(isVisibleToUser);
     }


由于setUserVisibleHint优于onCreate调用,所以当onCreate调用完毕setUserVisibleHint就不会触发,这时需要在首个显示的fragment调用setUserVisibleHint方法

1
2
3
4
5
6
@Override
     public  void  onActivityCreated(Bundle savedInstanceState) {
         // TODO Auto-generated method stub
         setUserVisibleHint( true );
         super .onActivityCreated(savedInstanceState);
     }

这个是设置viewpager保留多少个显示界面

1
pager.setOffscreenPageLimit( 3 );
  

 


二.ViewPager+Fragment

 

 

这里讲的是ViewPager里面嵌套Fragment,首先要明白一点是,延迟加载并不代表不实例化左右的两个pager,而是实例化了,但先不获取数据,等到左右的pager显示的时候再去获取数据并显示

1.Activity中

 

public class MainActivity extends FragmentActivity { private ViewPager mViewPager; private MyFragmentPagerAdapter pagerAdapter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mViewPager = (ViewPager) findViewById(R.id.myViewPager); pagerAdapter = new MyFragmentPagerAdapter(getSupportFragmentManager()); mViewPager.setOffscreenPageLimit(3); mViewPager.setAdapter(pagerAdapter); }}
2.自定义的Adapter中

 

 

public class MyFragmentPagerAdapter extends FragmentPagerAdapter{ public MyFragmentPagerAdapter(FragmentManager fm) { super(fm); } @Override public Fragment getItem(int position) { return MyPagerFragment.create(position); } @Override public void destroyItem(ViewGroup container, int position, Object object) { super.destroyItem(container, position, object); } @Override public int getCount() { return 3; }}

 

 

 

3.接下来是重点,是fragment,因为我想延迟加载,也就是在fragment可见时候加载,所以需要在这里进行判断,这里有个方法是setUserVisibleHint()
这里说几个注意点:
(1)在第一个页面时,几个方法的加载顺序是:第0个setUserVisibleHint()—— 第0个onCreate—— 第0个onCreateView——第0个onResume——第1个onCreate——第1个onCreateView——第2个onCreate——第2onCreateView—— 第1个onResume——第2个onResume
(2)滑到第二个pager时,就只调用setUserVisibleHint()了,也就是说显示第二页的内容是在第一个pager里做完的
 

首先

 

 

@Override public void setUserVisibleHint(boolean isVisibleToUser) { if (isVisibleToUser) { Log.d("Tag", "setUserVisibleHint,currentPageNum=" + currentPageNum + ",加载数据"); showData(); } super.setUserVisibleHint(isVisibleToUser); }
而在showData()里判断ListView是否为空,因为在第一个pager时,到这里方法的时候ListView还是空的

 

 

 

 

private void showData(){ Log.d("Tag", "showData()---isInit="+isInit); if(isInit){ list = new ArrayList<String>(); for (int i = 0; i < 10; i++) { list.add(currentPageNum + ""); isInit = false; } if(lv!=null){ ArrayAdapter<String> adapter = new ArrayAdapter<String>(getActivity(), android.R.layout.simple_list_item_1, list); lv.setAdapter(adapter); } } }
这里就说明了ListView在第一个页面是还没有填充数据的,所以需要在onResume(其他地方也行),通过判断当时的这个fragment是否显示来判断是否填充数据

 

 

 

 

@Override public void onResume() { super.onResume(); Log.d("Tag", "onResume()--currentPageNum="+currentPageNum+",getUserVishbleHint()="+getUserVisibleHint()); if(getUserVisibleHint()){ ArrayAdapter<String> adapter = new ArrayAdapter<String>(getActivity(), android.R.layout.simple_list_item_1, list); lv.setAdapter(adapter); } }
下面这是整个fragment的代码

 

 

package com.example.viewpagerdemo;import java.util.ArrayList;import android.os.Bundle;import android.support.annotation.Nullable;import android.support.v4.app.Fragment;import android.util.Log;import android.view.LayoutInflater;import android.view.View;import android.view.ViewGroup;import android.widget.ArrayAdapter;import android.widget.ListView;public class MyPagerFragment extends Fragment { public static final String ARG_PAGE = "page_num"; private int currentPageNum; private boolean isInit = true; private ArrayList<String> list = new ArrayList<String>(); private View view; private ListView lv; public static MyPagerFragment create(int pagerNum) { MyPagerFragment myPagerFragment = new MyPagerFragment(); Bundle arg = new Bundle(); arg.putInt(ARG_PAGE, pagerNum); myPagerFragment.setArguments(arg); return myPagerFragment; } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); currentPageNum = getArguments().getInt(ARG_PAGE); Log.d("Tag","调用onCreate--currentPageNum="+currentPageNum); } @Override public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { view = inflater.from(getActivity()).inflate( R.layout.fragment_pager, null); isInit = true; lv = (ListView) view.findViewById(R.id.listView); Log.d("Tag", "onCreateView--currentPageNum:" + currentPageNum + ",getUserVisibleHint()=" + getUserVisibleHint()); return view; } @Override public void onResume() { super.onResume(); Log.d("Tag", "onResume()--currentPageNum="+currentPageNum+",getUserVishbleHint()="+getUserVisibleHint()); if(getUserVisibleHint()){ ArrayAdapter<String> adapter = new ArrayAdapter<String>(getActivity(), android.R.layout.simple_list_item_1, list); lv.setAdapter(adapter); } } @Override public void setUserVisibleHint(boolean isVisibleToUser) { if (isVisibleToUser) { Log.d("Tag", "setUserVisibleHint,currentPageNum=" + currentPageNum + ",加载数据"); showData(); } super.setUserVisibleHint(isVisibleToUser); } private void showData(){ Log.d("Tag", "showData()---isInit="+isInit); if(isInit){ list = new ArrayList<String>(); for (int i = 0; i < 10; i++) { list.add(currentPageNum + ""); isInit = false; } if(lv!=null){ ArrayAdapter<String> adapter = new ArrayAdapter<String>(getActivity(), android.R.layout.simple_list_item_1, list); lv.setAdapter(adapter); } } }}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值