Android FragmentStatePageAdapter的使用Demo
上一篇写过FragmentPagerAdapter,这篇来介绍FragmentStatePagerAdapter,那么两者之间有何差别呢:
FragmentPagerAdapter很多其它的用于少量界面的ViewPager,比方Tab。划过的fragment会保存在内存中,虽然已经划过。而FragmentStatePagerAdapter和ListView有点类似,会保存当前界面,以及下一个界面和上一个界面(假设有),最多保存3个,其它会被销毁掉。
假设想要更具体的了解,能够查看官网API,以下给出依照官网上写出的Demo:
实现效果图:
源码:
布局文件:
fragment_pager.xml(布局了ViewPager和两个button):
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center_horizontal"
android:orientation="vertical"
android:padding="4dip" > <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:
<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用来显示Fragment的页数 --> <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" /> <!-- 不为空用来显示ListView,假设为空,则显示TextView(数据为空) --> <FrameLayout
android:layout_width="match_parent"
android:layout_height="0dip"
android:layout_weight="1" > <ListView
android:id="@android:id/list"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:drawSelectorOnTop="false" /> <TextView
android:id="@android:id/empty"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:text="数据为空"
android:textAppearance="?android:attr/textAppearanceMedium" />
</FrameLayout> </LinearLayout>
代码文件:
MainActivity:
package com.fragmentdemo13_fragmentstatepageradapter; import android.os.Bundle;
import android.support.v4.app.FragmentActivity;
import android.support.v4.view.ViewPager;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
/**
* 这里我们调用的是support.v4的包,所以MainActivity继承的是FragmentActivity,而不是Activity。
*/
public class MainActivity extends FragmentActivity {
public static final int NUM_ITEMS = 10;
private MyAdapter mAdapter;
private ViewPager mPager;
private Button button_first, button_last; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.fragment_pager);
/**
* 相同,因为调用的是support.v4的包,这里是getSupportFragmentManager(),而不是getFragmentManager();
*/
mAdapter = new MyAdapter(getSupportFragmentManager()); mPager = (ViewPager) findViewById(R.id.pager);
mPager.setAdapter(mAdapter);
/**
* 点击返回首页
*/
button_first = (Button) findViewById(R.id.goto_first);
button_first.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
mPager.setCurrentItem(0);
}
});
/**
* 点击返回尾页
*/
button_last = (Button) findViewById(R.id.goto_last);
button_last.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
mPager.setCurrentItem(NUM_ITEMS - 1);
}
}); } }
MyAdapter.java:
package com.fragmentdemo13_fragmentstatepageradapter; import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentStatePagerAdapter; /**
* 这里继承的是FragmentStatePagerAdapter, 依据官方API的介绍,当项目中遇到使用大量的列表页面时,使用该适配器是个更好的选择。
* (This version of the pager is more useful when there are a large number of
* pages, working more like a list view.)
*/
public class MyAdapter extends FragmentStatePagerAdapter { public MyAdapter(FragmentManager fm) {
super(fm);
}
/**
* 仅仅须要实现以下两个方法就可以。
*/
@Override
public Fragment getItem(int position) {
return ArrayListFragment.newInstance(position);
} @Override
public int getCount() {
return MainActivity.NUM_ITEMS;
} }
ArrayListFragment.java:
package com.fragmentdemo13_fragmentstatepageradapter; import java.util.ArrayList; import android.os.Bundle;
import android.support.v4.app.ListFragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast; public class ArrayListFragment extends ListFragment {
private int mNum;
public ArrayList<String> list = new ArrayList<String>(); /**
* 创建一个计算Fragment页面的实例,将怒num作为一个參数。
* (Create a new instance of
* CountingFragment, providing "num" as an argument.)
*/
public static ArrayListFragment newInstance(int num) { ArrayListFragment f = new ArrayListFragment();
Bundle args = new Bundle();
args.putInt("num", num);
f.setArguments(args); return f;
} /**
* 当调用该方法时,检索此实例的数量的參数。
* (When creating, retrieve this instance's number from
* its arguments.)
*/
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mNum = getArguments() != null ? getArguments().getInt("num") : 1;
} /**
* Fragment的UI仅仅显示它所在的页码。
* (The Fragment's UI is just a simple text view
* showing its instance number.)
*/
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_pager_list, container,
false);
TextView tv = (TextView) view.findViewById(R.id.text);
tv.setText("Fragment #" + mNum);
return view;
} @Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
setListAdapter(new ArrayAdapter<String>(getActivity(),
android.R.layout.simple_list_item_1, getData()));
} /**
* 在每个Fragment列表中展示的数据。
*/
private ArrayList<String> getData() {
for (int i = 0; i < 20; i++) {
list.add("nihao" + i);
}
return list;
} @Override
public void onListItemClick(ListView l, View v, int position, long id) {
Toast.makeText(getActivity(), "您点击了"+position, 0).show();
} }
源码下载:
Android FragmentStatePageAdapter的使用Demo的更多相关文章
- 解决Android微信支付官方demo运行失败
Android微信支付官方demo运行失败,在此简单记录一下解决步骤 1.httpclient错误 官方给的demo是eclipse的,打开之后提示httpclient的错误,我知道在as下解决htt ...
- Android JNI学习(五)——Demo演示
本系列文章如下: Android JNI(一)——NDK与JNI基础 Android JNI学习(二)——实战JNI之“hello world” Android JNI学习(三)——Java与Nati ...
- Android之ViewPager循环Demo
ViewPager是谷歌官方提供的兼容低版本安卓设备的软件包,里面包含了只有在安卓3.0以上可以使用的api.Viewpager现在也算是标配了,如果一个App没有用到ViewPager感觉还是比较罕 ...
- Android studio百度地图demo出现230错误,key校验失败
转自daoxiaomianzi原文 Android studio 百度地图demo出现230错误,key校验失败 使用AndroidStudio导入Baidu地图的as版的demo,引入后,发现没有k ...
- Android第一代壳demo编写
Android第一代壳Demo编写 前言 这篇文章是对姜维大佬的这篇文章[Android中的Apk的加固(加壳)原理解析和实现]的补充.建议先看一编姜维大佬的这篇文章再看. 姜维大佬写那篇文章的时间距 ...
- Android -- 自定义View小Demo,动态画圆(一)
1,转载:(http://blog.csdn.NET/lmj623565791/article/details/24500107),现在如下图的效果: 由上面的效果图可以看到其实是一个在一个圆上换不同 ...
- 转:android surface简单使用Demo
转: http://blog.csdn.net/listening_music/article/details/6860786 通过之前介绍的如何自定义View, 我们知道使用它可以做一些简单的动画效 ...
- 转:android 录制视频的Demo
转:http://blog.csdn.net/peijiangping1989/article/details/7049991 在这里给出自己的一个测试DEMO,里面注释很详细.简单的视频录制功能. ...
- android Popupwindow 的一个demo源码
一直想用一下PopupWindow,就是苦于没有demo,自己去研究有太懒,刚好最近研究推送,下载了一个腾讯信鸽的demo,里面用到了一个PopupWindow,效果还不错,弄下来记录一下: 1.核心 ...
随机推荐
- mfc修改应用程序外观
1.在窗口创建前修改窗体外观 在BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs)函数中修改,其中CREATESTRUCT结构中有诸如窗口大小 ...
- APNS 那些事!
之前在消息推送中间件APush里实现了对APNS的桥接.并利用业余时间阅读了官方指南Local and Push Notification Programming Guide.蛮有心得的.稍作总结.分 ...
- FZU 1894 (双端队列)
Problem 1894 志愿者选拔 Accept: 1166 Submit: 3683 Time Limit: 1500 mSec Memory Limit : 32768 KB Pr ...
- CentOS6.4 安装Mysql
虽说,新版的数据包可能会带上一些新特性,但是数据库对我而言,还是稳定版优先.因为新特性不一定我会用到.. 下载安装: yum list | grep mysql 因为是准备搞开发用的,所以只要安装my ...
- 14.6.7?Limits on InnoDB Tables InnoDB 表的限制
14.6.7?Limits on InnoDB Tables InnoDB 表的限制 警告: 不要把MySQL system tables 从MyISAM 到InnoDB 表. 这是不支持的操作,如果 ...
- 谈论multistage text input(中国输入法)下一个UITextView内容长度的限制
我以前写<如何更好地限制UITextField输入长度>.接使用 UIKIT_EXTERN NSString *const UITextFieldTextDidChangeNotifica ...
- NYOJ 623 A*B ProblemII
A*B Problem II 时间限制:1000 ms | 内存限制:65535 KB 难度:1 描写叙述 ACM的C++同学有好多作业要做,最头痛莫过于线性代数了.由于每次做到矩阵相乘的时候,大 ...
- Substrings 第37届ACM/ICPC 杭州赛区现场赛C题(hdu 4455)
http://acm.hdu.edu.cn/showproblem.php?pid=4455 https://icpcarchive.ecs.baylor.edu/index.php?option=c ...
- 英特尔的VT-d技术是什么?
VT-d技术: 我们知道对于服务器而言,很重要的一个组成部分就I/O,CPU的计算能力提升虽然可以更快地处理数据,但是前提是数据能够顺畅的到达CPU,因此,无论是存储,还是网络,以及图形卡.内存等,I ...
- hdu 4277
题目链接 #include <cstdio> //by-ACMer_xiaohao #include <cstring> #include <map> using ...