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,所以需要一些常量进行判断
这个是设置viewpager保留多少个显示界面
|
二.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; }}
首先
@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); } } }}