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

本文介绍如何在使用ViewPager结合Fragment时,只在当前页面加载数据,避免预加载相邻页面。示例代码展示了一个包含5个Fragment的ViewPager,当滑动到特定页面时,该页面会在3秒后改变颜色,其他未显示的页面保持不变。通过这种方式优化了性能。详细实现可参考提供的源码链接。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

通常我们在使用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")]);
			}
		};
	};


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

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

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







评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值