ViewPager+Fragment 仅加载当前页面的demo

来源:互联网 发布:mac浏览器自动跳转 编辑:程序博客网 时间:2024/04/29 12:02

通常我们在使用ViewPager 加载 Fragment的时候,ViewPager通常会预加载当前显示界面相邻界面的Fragment,如果我们想显示哪个界面,就加载哪个界面的数据,那应当如何做呢?实现的核心思想就是当前界面的fragment显示给用户的时候,我们就进行数据的加载,没有显示的时候就不进行加载。下面这个demo就实现了这个功能。


简述一下这个demo主要实现了什么,一个ViewPager和5个Fragment的界面,当滑动到哪个页面,哪个页面就将在3秒后将该界面的颜色改变,其他未显示的界面将不产生变化。

首先看下布局文件:

main.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"    xmlns:tools="http://schemas.android.com/tools"    android:layout_width="match_parent"    android:layout_height="match_parent"    tools:context=".MainActivity" ><android.support.v4.view.ViewPager    android:layout_width="match_parent"    android:layout_height="match_parent"    android:id="@+id/pager"    /></RelativeLayout>

主布局就只有一个ViewPager,没有什么可说的


fglayout.xml

<?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:id="@+id/TestLayout"    android:layout_width="match_parent"    android:layout_height="match_parent"    android:orientation="vertical"    >    <TextView        android:id="@+id/testText"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:layout_centerInParent="true"        android:text="正在加载中" /></RelativeLayout>
5个Fragment的布局,简单的显示了一个TextView,用来标识该页面的加载是否完毕

5个界面的Fragment均用的这个布局,该Fragment的类是TestFragment.java文件,下面我们来看一下这个文件:

public class TestFragment extends Fragment {private TextView textView;private RelativeLayout layout;//定义了一个颜色数组,是第几个页面的Fragment,就用第几个页面的颜色private int[] ColorList = { Color.LTGRAY, Color.BLUE, Color.CYAN,Color.DKGRAY, Color.GREEN };
上边的颜色数组就是用来模拟该页面加载完毕的过程,每个页面的显示颜色不同,textView用来显示加载的过程中的提示文字,layout后面作为背景颜色改变的layout
@Overridepublic View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) {View view = inflater.inflate(R.layout.fglayout, container, false);textView = (TextView) view.findViewById(R.id.testText);layout = (RelativeLayout) view.findViewById(R.id.TestLayout);return view;}
下面的方法就是实现的核心,该方法用于告诉我们当前界面的UI对于用户是否可见,如果可见,isVisibleToUser就返回true,我们在这里面首先让textView显示了正在加载的字样,并将背景颜色默认设置成白色,当该界面对用户可见时,让handler发送一条延时的消息(模拟下耗时操作)通知界面将背景颜色改变。

@Overridepublic void setUserVisibleHint(boolean isVisibleToUser) {if (textView != null) {textView.setText("正在加载中");layout.setBackgroundColor(Color.WHITE);}if (isVisibleToUser) {handler.sendEmptyMessageDelayed(1, 3000);}super.setUserVisibleHint(isVisibleToUser);}

hander里面的内容:

private Handler handler = new Handler() {@Overridepublic void handleMessage(android.os.Message msg) {if (textView != null) {textView.setText("加载已经完成");layout.setBackgroundColor(ColorList[getArguments().getInt("id")]);}};};


下面是MainActivity.java的内容,主要就是将5个Fragment放到ViewPager,并且将每个Fragment标识一下(setArgument)

public class MainActivity extends FragmentActivity {private ViewPager pager;private TestFragment[] fgs;private FragmentPagerAdapter adapter;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);pager = (ViewPager) findViewById(R.id.pager);fgs = new TestFragment[5];for (int i = 0; i < 5; i++) {fgs[i] = new TestFragment();Bundle bundle = new Bundle();bundle.putInt("id", i);fgs[i].setArguments(bundle);}FragmentManager manager = getSupportFragmentManager();adapter = new FragmentPagerAdapter(manager) {@Overridepublic int getCount() {return fgs.length;}@Overridepublic Fragment getItem(int arg0) {return fgs[arg0];}};pager.setAdapter(adapter);pager.setCurrentItem(0);}}

附上源码地址:http://download.csdn.net/detail/tc598100922/7334065

第一次写文章,如果有不足的地方,欢迎指出。







0 0