通常我们在使用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@Override
public 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发送一条延时的消息(模拟下耗时操作)通知界面将背景颜色改变。
@Override
public 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() {
@Override
public void handleMessage(android.os.Message msg) {
if (textView != null) {
textView.setText("加载已经完成");
layout.setBackgroundColor(ColorList[getArguments().getInt("id")]);
}
};
};
public class MainActivity extends FragmentActivity {
private ViewPager pager;
private TestFragment[] fgs;
private FragmentPagerAdapter adapter;
@Override
protected 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) {
@Override
public int getCount() {
return fgs.length;
}
@Override
public Fragment getItem(int arg0) {
return fgs[arg0];
}
};
pager.setAdapter(adapter);
pager.setCurrentItem(0);
}
}
附上源码地址:http://download.youkuaiyun.com/detail/tc598100922/7334065
第一次写文章,如果有不足的地方,欢迎指出。