Fragment与Viewpager及FragmentStatePagerAdapter
2014-05-07 19:56
483 查看
前两篇我们讲过PagerAdapter和FragmentPagerAdapter,这里将介绍第三个适配器即FragmentStatePagerAdapter,它和ListView有点类似,会保存当前界面,以及下一个界面和上一个界面(如果有),最多会保存3个,其他会被销毁掉。需要注意的是FragmentStatePagerAdapter可能会不经意间造成内存未正常回收,严重导致内存溢出,比如图片资源没有释放,资源引用问题。
MainActivity.java代码:
activity_main.xml:
fragment_pager_list.xml:
MainActivity.java代码:
public class MainActivity extends FragmentActivity { private ViewPager viewPager; static final int NUM_ITEMS = 10;// 定义一共有10页 private MyAdapter adapter; private Button go_first; private Button go_last; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); viewPager = (ViewPager) this.findViewById(R.id.pager); adapter = new MyAdapter(getSupportFragmentManager()); go_first = (Button) this.findViewById(R.id.goto_first); go_last = (Button) this.findViewById(R.id.goto_last); go_first.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub viewPager.setCurrentItem(0); } }); go_last.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub viewPager.setCurrentItem(NUM_ITEMS - 1); } }); viewPager.setAdapter(adapter); } // 填充适配器的数据:每一页都是Fragment public static class MyAdapter extends FragmentStatePagerAdapter { public MyAdapter(FragmentManager fm) { super(fm); // TODO Auto-generated constructor stub } @Override public Fragment getItem(int arg0) { // TODO Auto-generated method stub return ArrayListFragment.getIntances(arg0); } @Override public int getCount() { // TODO Auto-generated method stub return NUM_ITEMS; } } public static class ArrayListFragment extends ListFragment { int num; static ArrayListFragment getIntances(int num) { ArrayListFragment listFragment = new ArrayListFragment(); Bundle bundle = new Bundle(); bundle.putInt("num", num); listFragment.setArguments(bundle); return listFragment; } @Override public void onActivityCreated(Bundle savedInstanceState) { // TODO Auto-generated method stub super.onActivityCreated(savedInstanceState); setListAdapter(new ArrayAdapter<String>(getActivity(), android.R.layout.simple_list_item_1, getData())); } public List<String> getData() { List<String> list = new ArrayList<String>(); for (int i = 0; i < 20; i++) { list.add("jack" + i); } return list; } @Override public void onCreate(Bundle savedInstanceState) { // TODO Auto-generated method stub super.onCreate(savedInstanceState); System.out.println("------>>" + num); num = (getArguments() != null ? getArguments().getInt("num") : 1); } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(R.layout.fragment_pager_list, null); TextView textView = (TextView) view.findViewById(R.id.text); textView.setText("Fragment #" + num); // TODO Auto-generated method stub return view; } @Override public void onPause() { // TODO Auto-generated method stub super.onPause(); } @Override public void onListItemClick(ListView l, View v, int position, long id) { Log.i("FragmentList", "Item clicked: " + id); } } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.main, menu); return true; } }
activity_main.xml:
<LinearLayout 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" android:gravity="center_horizontal" android:orientation="vertical" android:padding="4dip" tools:context=".MainActivity" > <android.support.v4.view.ViewPager android:id="@+id/pager" android:layout_width="match_parent" android:layout_height="0px" android:layout_weight="1" > </android.support.v4.view.ViewPager> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_weight="0" android:gravity="center" android:measureWithLargestChild="true" android:orientation="horizontal" > <Button android:id="@+id/goto_first" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="跳到首页" > </Button> <Button android:id="@+id/goto_last" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="跳到尾页" > </Button> </LinearLayout> </LinearLayout>
fragment_pager_list.xml:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:background="@android:drawable/gallery_thumb" android:orientation="vertical" > <TextView android:id="@+id/text" android:layout_width="match_parent" android:layout_height="wrap_content" android:gravity="center_vertical|center_horizontal" android:text="@string/hello_world" android:textAppearance="?android:attr/textAppearanceMedium" /> <!-- The frame layout is here since we will be showing either the empty view or the list view. --> <FrameLayout android:layout_width="match_parent" android:layout_height="0dip" android:layout_weight="1" > <!-- Here is the list. Since we are using a ListActivity, we have to call it "@android:id/list" so ListActivity will find it --> <ListView android:id="@android:id/list" android:layout_width="match_parent" android:layout_height="match_parent" android:drawSelectorOnTop="false" /> <!-- Here is the view to show if the list is emtpy --> <TextView android:id="@android:id/empty" android:layout_width="match_parent" android:layout_height="match_parent" android:text="No items." android:textAppearance="?android:attr/textAppearanceMedium" /> </FrameLayout> </LinearLayout>
相关文章推荐
- ViewPager适配器学习记要( pageAdapter和FragmentPagerAdapter/FragmentStatePagerAdapter))
- 关于ViewPager、PagerAdapter、FragmentStatePagerAdapter
- 自定义日历 ViewPager FragmentStatePagerAdapter 自定义View
- HorizontalScrollView,Fragment,FragmentStatePagerAdapter打造网易新闻Tab及滑动页面效果(三十六)
- ViewPager适配器FragmentStatePagerAdapter 与FragmentPagerAdapter
- ViewPager-------Fragment作为ViewPager的数据源(FragmentStatePagerAdapter)
- ViewPager适配器学习记录( pageAdapter和FragmentPagerAdapter/FragmentStatePagerAdapter))
- PagerAdapter、FragmentPagerAdapter及FragmentStatePagerAdapter与Viewpager
- android ViewPager学习(四)FragmentStatePagerAdapter viewpager内fragment的替换
- viewpager fragment FragmentStatePagerAdapter数据删除后更新界面
- ViewPager适配器学习记录( pageAdapter和FragmentPagerAdapter/FragmentStatePagerAdapter))
- [android]与 ViewPager fragment里面fragment和 FragmentStatePagerAdapter 的结果,在异常 (与完整的示例)
- ViewPager源码解析之FragmentPagerAdapter和FragmentStatePagerAdapter
- FragmentPager +ViewPager +FragmentStatePagerAdapter详解
- ViewPager 的适配器 PagerAdapter 、FragmentPagerAdapter与FragmentStatePagerAdapter使用详解与区别
- viewpager : FragmentStatePagerAdapter和FragmentPagerAdapter
- ViewPager,PagerAdapter,FragmentPagerAdapter,FragmentStatePagerAdapter
- TabLayout+Fragment+ViewPager+FragmentStatePagerAdapter实现Tab标签
- TabLayout+Fragment+ViewPager+FragmentStatePagerAdapter实现Tab标签
- ViewPager、PagerTabStrip、FragmentPagerStateAdapter实现状态栏切换界面