ViewPager 简单使用
Table of Contents
1 ViewPager
ViewPager
简单来说就是一个能滑动切换视图的控件,由一个 Activity
包裹,总体结构是
Activity
- adapter
fragment
fragment
fragment
- adapter
其中 Activity
通过 adapter 来操作 fragment
显示
1.1 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; } }
1.2 Adapter 介绍
Adapter
虽然有三种,但这里只需要介绍 FragmentPagerAdapter
与 FragmentStatePagerAdapter
即可,他们两个需要重写的方法是一致的
1.2.1 FragmentPagerAdapter
FragmentPagerAdapter
是PagerAdapter
中的其中一种实现- 它将每一个页面表示为一个
Fragment
,并且每一个Fragment
都将会保存到fragment manager
当中 - 这种pager十分适用于有一些静态
fragment
,例如一组tabs
的时候使用 - 每个页面对应的
Fragment
当用户可以访问的时候会一直存在内存中,但是,当这个页面不可见的时候,view hierarchy将会被销毁 - 这样子会导致应用程序占有太多资源。当页面数量比较大的时候,建议使用
FragmentStatePagerAdapter
1.2.2 FragmentStatePagerAdapter
- 当使用FragmentStatePagerAdapter 时,实现将只保留当前页面,当页面离开视线后,就会被消除,释放其资源
- 而在页面需要显示时,生成新的页面
- 这么实现的好处就是当拥有大量的页面时,不必在内存中占用大量的内存
1.2.3 实例
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(); } }
1.3 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; } }