Contents

ViewPager 简单使用

ViewPager

ViewPager 简单来说就是一个能滑动切换视图的控件,由一个 Activity 包裹,总体结构是

  • Activity
    • adapter
      • fragment
      • fragment
      • fragment

其中 Activity 通过 adapter 来操作 fragment 显示

Activity 布局

activity_pageview.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" >

  <androidx.viewpager.widget.ViewPager
      android:id="@+id/viewpager"
      android:layout_width="fill_parent"
      android:layout_height="fill_parent" />

</RelativeLayout>

PageViewActivity.java

public class PageViewActivity extends FragmentActivity {
    MyPageAdapter pageAdapter;

    @Override
    public void onCreate(Bundle savedInstanceState) {
	super.onCreate(savedInstanceState);
	setContentView(R.layout.activity_page_view);

	List<Fragment> fragments = getFragments();

	pageAdapter = new MyPageAdapter(getSupportFragmentManager(), fragments);

	ViewPager pager = (ViewPager) findViewById(R.id.viewpager);
	pager.setAdapter(pageAdapter);

    }

    private List<Fragment> getFragments() {
	List<Fragment> fList = new ArrayList<Fragment>();

	fList.add(MyFragment.newInstance("Fragment 1"));
	fList.add(MyFragment.newInstance("Fragment 2"));
	fList.add(MyFragment.newInstance("Fragment 3"));

	return fList;
    }
}

Adapter 介绍

Adapter 虽然有三种,但这里只需要介绍 FragmentPagerAdapterFragmentStatePagerAdapter 即可,他们两个需要重写的方法是一致的

FragmentPagerAdapter

  • FragmentPagerAdapterPagerAdapter 中的其中一种实现
  • 它将每一个页面表示为一个 Fragment ,并且每一个 Fragment 都将会保存到 fragment manager 当中
  • 这种pager十分适用于有一些静态 fragment ,例如一组 tabs 的时候使用
  • 每个页面对应的 Fragment 当用户可以访问的时候会一直存在内存中,但是,当这个页面不可见的时候,view hierarchy将会被销毁
  • 这样子会导致应用程序占有太多资源。当页面数量比较大的时候,建议使用 FragmentStatePagerAdapter

FragmentStatePagerAdapter

  • 当使用FragmentStatePagerAdapter 时,实现将只保留当前页面,当页面离开视线后,就会被消除,释放其资源
  • 而在页面需要显示时,生成新的页面
  • 这么实现的好处就是当拥有大量的页面时,不必在内存中占用大量的内存

实例

MyPageAdapter.java

public class MyPageAdapter extends FragmentStatePagerAdapter {
    private List<Fragment> fragments;

    public MyPageAdapter(FragmentManager fm, List<Fragment> fragments) {
	super(fm);
	this.fragments = fragments;
    }
    @Override
    public Fragment getItem(int position) {
	return this.fragments.get(position);
    }

    @Override
    public int getCount() {
	return this.fragments.size();
    }
}

Fragment 布局

fragment_layout.xml

<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
	  android:id="@+id/tv_bg"
	  android:layout_width="match_parent"
	  android:layout_height="match_parent"
	  android:gravity="center_horizontal"
	  android:paddingTop="100dp">

</TextView>

MyFragment.java

public class MyFragment extends Fragment {
    public static final String EXTRA_MESSAGE = "EXTRA_MESSAGE";

    public static final MyFragment newInstance(String message)
    {
	MyFragment f = new MyFragment();
	Bundle bdl = new Bundle(1);
	bdl.putString(EXTRA_MESSAGE, message);
	f.setArguments(bdl);
	return f;
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
			     Bundle savedInstanceState) {
	String message = getArguments().getString(EXTRA_MESSAGE);
	View v = inflater.inflate(R.layout.myfragment_layout, container, false);
	TextView messageTextView = (TextView)v.findViewById(R.id.textView);
	messageTextView.setText(message);

	return v;
    }

}