1.Common Layout 基础(四大布局)
1.RelativeLayout(相对布局)
1)设置距parent布局的距离:align_xxxx
2)t设置View控件位于哪个控件的位置:toStartOf,toEndOf,below,above,....
4)设置位于父View的位置:layout_alignWithParent(true,false)
5)居中显示:layout_center
2.LinearLayout(线性布局)
1)设置元素排列顺序:orientation(横向纵向排列)
2)设置权重:weight
3)设置元素的位置:layout_gravity
3.GridLayout (网格布局,以网格形式对页面元素进行规划,设置);
1)列的数量:columnCount
2) 行的数量:rowCount
3)第几列,下标从0开始:layout_column
4)水平填充:layout_gravity
5)跨列合并行:layout_columnSpan
6)跨行合并列:layout_rowSpan
4.FrameLayout(帧布局,以层次结构默认从左上角开始布局)
1)指定元素位置,对齐方式:layout_gravity
Common Layout 优化
1.优化view层次体系,view对象个数。
1)借助merge标签合并相同元素(例如连续两个framelayout嵌套)
a)merge在文档中必须是根元素
b)merge中定义的属性会参考父容器(parent)中相同元素的属性
2)从设计角度出发,要考虑层次体系(采用不同方式设计一个list item布局)
2.优化view加载时机(采用延迟加载策略):何时需要何时加载
a)在布局文件中借助ViewStub元素引入其它相关布局文件
b)在Android的java代码中需要时执行ViewStub对象的inflate方法加载布局
3.优化view维护时间(可以考虑布局重用)
a)借助include标签包含其它通用布局(各个页面中相同的部分)
<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" >
<!-- 动态包含其他布局 -->
<include layout="@layout/page_tilte"/>
</RelativeLayout>
<pre name="code" class="html"><?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:textSize="24sp"
android:gravity="center"
android:id="@+id/titleId"
android:background="#00000000"
android:textColor="#00ffffff"
>
</TextView>
</pre><p></p><p></p>1.Adapter Layout 1)是一个ViewGroup(视图组,容器)2)是一个Adapter View(适配视图)2.Adapter Layout 常用类型1)ListView (列表容器)2)GridView (网格容器)3)Spinner (下拉列表)4)ViewPager(分页容器)5).....................3.Adapter Layout 的构成及原理分析1)构成:a)适配容器 (Adapter Layout)b)适配器(Adapter)c)资源(Context,view,data)2)原理:对于一个Adapter Layout对象的构建,需要通过一个adapter对象,将相关资源构建成item,然后将这些item交给相关Adapter Layout对象显示。4.Adapter Layout 应用中涉及到的相关Adapter1)一个接口(ListAdapter)2)一个抽象(BaseAdapter)3)三个具体:(ArrayAdapter,SimpleAdapter,CursorAdapter)4)一个扩展:(PagerAdapter,应用于viewPager)5)一种自定义(直接或间接的继承BaseAdapter)-----------------------------------------------------------------------------------Adpater Layout 基础(ListView 布局)1.ListView1)一个View (呈现数据)2)一个ViewGroup (布局,规划view)3)一个AdapterView(数据的加载需要借助adapter)4)一个列表容器(以列表形式呈现数据)2.ListView的应用场合借助listview以列表形式呈现数据非常方便。1)微信好友列表2)QQ好友列表3)股票信息列表4)软件列表5)联系人列表6)通话记录列表7)新闻列表,....3.ListView 应用的基本实现ListView 的构成及其实现原理符合Adapter Layout.1)获得Listview对象(findViewById,new ListView(this))2)构建适配器,借助适配器对象构建列表项对象(list item)3)ListView 关联适配器(底层会借助adapter提取item)<p></p><pre name="code" class="java">//1)获得Listview对象(findViewById,new ListView(this))
ListView lsv = (ListView) findViewById(R.id.lsvId);
//2)构建适配器,借助适配器对象构建列表项对象(list item)
ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,//Context(资源方法对象)
android.R.layout.simple_list_item_1, // (resource,构建item的布局模板)
new String[] { "A", "B", "C", "D" });
//3)ListView 关联适配器(底层会借助adapter提取item)
lsv.setAdapter(adapter);
4.ListView 相关适配应用
相关API:(ListAdapter)
1)ArrayAdapter
a)构建(参考构造方法)
b)场合(item 数据为:8种基本数据类型+string)
List<String> list=new ArrayList<String>();
list.add("A");list.add("B");list.add("C");
//1)获得Listview对象(findViewById,new ListView(this))
ListView lsv = (ListView) findViewById(R.id.lsvId);
//2)构建适配器,借助适配器对象构建列表项对象(list item)
ArrayAdapter<String> adapter =
new ArrayAdapter<String>(this,//Context(资源方法对象)
android.R.layout.simple_list_item_2, // (resource,构建item的布局模板)
android.R.id.text1,
list);
//3)ListView 关联适配器(底层会借助adapter提取item)
lsv.setAdapter(adapter);
2)SimpleAdapter
a)构建(参考构造方法)
b)场合(item 数据为:Map<String,?>)
List<Map<String,Object>> list=new ArrayList<Map<String,Object>>();
{
for(int i=0;i<images.length;i++){
Map<String,Object> map=new HashMap<String, Object>();
map.put("logo",images[i]);
map.put("name","City"+i);
list.add(map);//一个map对应listview中的item
3)BaseAdapter(抽象类)
a)构建(构建其子类类型对象,例如自定义适配器)
b)场合(官方给定的适配器不满足我们需求时)
new ArrayAdapter<Map<Integer,String>>(
this,android.R.layout.simple_list_item_2, list){
public View getView(int position, View convertView, ViewGroup parent) {
//1.item view
View v=View.inflate(getContext(),
android.R.layout.simple_list_item_2,null);
//2.item data
Map<Integer,String> map=
getItem(position);
//3.对号入座
TextView tv1=(TextView) v.findViewById(android.R.id.text1);
TextView tv2=(TextView) v.findViewById(android.R.id.text2);
tv1.setText(map.get(1));
tv2.setText(map.get(2));
return v;
}});
-----------------------------------------------------------------------------------
ListView 自定义适配的优化
1.适配器优化的目的
1)提高listview中item的显示效率.
2)改善用户体验。
2.适配器优化的方式(现阶段)
1)重用item view(饺子皮)
借助适配中convertView的值,实现item View的重用。
当listview中显示内容比较多,执行上下滑动时,滑出
的item会赋值给convertview.
FAQ
a)convertView 是什么?(列表项对象)
b)convertView 何时有值?(滑动listview时)
c)convertView 由谁赋值?(由底层系统赋值)
2)减少item view中子元素的查找次数
在getView方法中,对于item view而言假如需要设置其子元素的值,通常需要调用view的findViewById方法先找到对应的子元素。而查找的过程是一个耗时操作,所以我们要减少这个查找次数。在android中给出的解决方案通常是定义一个类(例如ViewHolder)借助此类中的属性记录item view中每个子元素的位置。
public View getView(int position, View convertView, ViewGroup parent) {
//1.构建item view对象(饺子皮):参考mResource资源构建
View v=null;
ViewHolder vHolder=null;
if(convertView==null){//listview页面初始化时,convertview的值是null的
//inflate 方法的具体返回值类型对象由mResource的根元素决定
//v=View.inflate(mContext, mResource, null);
v=LayoutInflater.from(getContext())
.inflate(mResource, parent,false);
vHolder=new ViewHolder();//类似座位表(借助此对象记录item view中子元素的位置)
//查找item view中的子元素,并在viewHolder中进行记录
vHolder.iv=(ImageView) v.findViewById(R.id.imgId);
vHolder.tv=(TextView) v.findViewById(R.id.text01);
v.setTag(vHolder);//一个item view对象绑定一个viewHolder对象
}else{
v=convertView;//重用convertview,以减少item view的构建次数
vHolder=(ViewHolder)v.getTag();
}
//2.获得item 数据对象(饺子馅)
City c=(City)getItem(position);
//3.对号入座(将饺子馅放到饺子皮对应位置)
//3.1设置itemview 中子元素的值
vHolder.iv.setImageResource(c.getLogo());
vHolder.tv.setText(c.getName());
return v;//包好的饺子(底层会将此对象添加到listview)
}
class ViewHolder{//view对象的持有者
ImageView iv;
TextView tv;
}
ListView 的事件处理
1.ListView 事件类型
1)点击事件(短按,长按事件)
lsv.setOnItemClickListener(new OnItemClickListener() {
//回调函数
//点击listview中的某个item时会自动执行此方法
@Override
public void onItemClick(
AdapterView<?> parent,//ListView
View view, //列表项对象(list item)
int position, //item 的位置
long id) {//item id,现阶段与item position相同
//根据位置获得对应的item对象对应的数据
//底层会调用适配器的getItem方法
//此方法的返回值由getItem方法的返回值决定
City city=(City)//
parent.getItemAtPosition(position);
Toast.makeText(getApplicationContext(),//Context
city.getName(),//CharSequence
0//duration
).show();//显示信息
}
});
public boolean onItemLongClick(
<span style="white-space:pre"> </span>AdapterView<?> parent,View view,int position, long id) {
<span style="white-space:pre"> </span>Toast.makeText(this, "onItemLongClick",0).show();
<span style="white-space:pre"> </span>return true;
<span style="white-space:pre"> </span>//返回值表示此事件是否已经处理结束;
<span style="white-space:pre"> </span>//假如事件已经处理结束,且其它事件不要则进行处理,则返回true
<span style="white-space:pre"> </span> //返回false时,假如listview中还有其它事件,其它事件会继续执行
2)滚动事件(listview滚动时要进行如何处理)
/**滚动状态发生变化时执行*/
<span> </span>@Override
<span> </span>public void onScrollStateChanged(AbsListView view, int scrollState) {
<span> </span>
<span> </span>}
<span> </span>/**滚动时执行此方法*/
<span> </span>@Override
<span> </span>public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
<span> </span>
<span> </span>}
2.ListView 事件监听器(观察者对象)
1)OnItemClickListener
2)OnItemLongClickListener
3)OnScrollListener
3.ListView 事件处理
1)添加事件监听器(关注添加方式及事件类型)
2)回调事件处理方法(属于监听器对象):关注业务
--------------------------------------------------------------------------------------------------------------------
ListView 中item的选择设置
1.ListView选择模式的设置(setChoiceModel(int model))
1)没选CHOICE_MODE_NONE
2)单选CHOICE_MODE_SINGLE
3)多选CHOICE_MODE_MULTIPLE
new ArrayAdapter<String>(this,
android.R.layout.simple_list_item_checked, list){
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View v=super.getView(position, convertView, parent);
int checked=((ListView)parent)
.getCheckedItemPosition();
if(checked==position){
v.setBackgroundColor(Color.GRAY);
}else{
v.setBackgroundColor(Color.WHITE);
}
return v;
}
};
2.有选择性的指定适配器关联的item布局
android.R.layout.simple_list_item_checked
3.有选择性的设置点击过的内容高亮显示
1)添加监听器(OnItemClickListener)
2)每次点击刷新ListView(adapter.notifyDataSetChanged)
3)重写适配器的getView,在此方法中获得选中的
item的位置,根据位置判定是否让此view高亮显示。
4.有选择性对选中内容进行删除
1)获得选中的内容(SparseBooleanArray)
2)从数据集中删除选中内容(list.removeAll(...))
3)通知更新(ListView进行刷新)
4)清除选中选项(listview.clearChoices())
-----------------------------------------------------------------------------------------
ListView 中内容的分组(分块)
1.应用场合
1)数据量比较小,且是一次加载.
2)数据已经有序(一般是升序)
例如:
1)手机联系人
2)汽车品牌
3).....
2.具体实现
1)对数据进行排序(借助Collections的sort方法)
2)每个item都显示key(A,B,C)
3)同一个分块中第一个item显示key,其它item隐藏key
3.1)根据位置获得当前模块(分组)的名称(key)
int getSectionForPosition(int position){}
此方法的返回值为块名称的ASCII;
3.2)获得此模块中位置(position)最小的值
int getPositionForSection(int section){}
此方法参数为块名称的ASCII码值
3.3)显示模块中最小位置的item中的key,其它key隐藏
/**根据位置获得当前模块(分组)的名称(key)
* @return 此方法的返回值为块名称的ASCII;
* */
public int getSectionForPosition(int position){
return ((City)getItem(position)).getKey()
.toUpperCase().charAt(0);
}
public int getPositionForSection(int section){
for(int i=0;i<getCount();i++){//i为所有位置
int sec=getSectionForPosition(i);
if(sec==section)return i;//此位置为最小位置
}
return -1;
}
------------------------------------------------------------------------------------------------------------------
ListView 分块中的右侧导航
1.右侧导航应用场合
构建于分块显示的基础上,希望能够快速定位某个模块。
2.右侧导航实现
1)在页面右侧再添加一个ListView
2)点击导航ListView中的item时,能够快速定位某个模块。
3)右侧列表点击过后高亮显示?
a)设置listview的选择模式
b)重写适配器的getview方法,判定位置的选中状态
c)点击item时刷新列表
3左侧列表在滑动时,右侧列表对应位置高显示
a)左侧列表添加滚动监听器
b)在listview滚动状态发生变化时,设置右侧列表高亮显示
b.1)获得左侧列表第一个item显示的位置
b.2)获得此位置对应的块(section)名称
b.3)获得此块名称在右侧列表中的位置
b.4)设置右侧列表此位置的item为选中状态
b.5)刷新右侧列表
public void onScrollStateChanged(AbsListView view, int scrollState) {
if(scrollState==
OnScrollListener.SCROLL_STATE_IDLE){
//获得第一个显示的item位置
int pos=view.getFirstVisiblePosition();
//获得此位置的块名称
char section=(char)//'A','B'
startAdapter.getSectionForPosition(pos);
//查找此块对应的右侧列表的位置
int rightPos=
chars.indexOf(String.valueOf(section));
Log.i("TAG", "rightPos="+rightPos);
//设置右侧对应位置选中
endLsv.setItemChecked(rightPos, true);
//刷新右侧列表
endAdapter.notifyDataSetChanged();
}
}
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
<span style="white-space:pre"> </span>if(requestCode==100&&resultCode==200){
<span style="white-space:pre"> </span>String name=data.getStringExtra("nameKey");
<span style="white-space:pre"> </span>MenuItem.setTitle(name);
<span style="white-space:pre"> </span>}
<span style="white-space:pre"> </span>}
<span style="white-space:pre"> </span>public boolean onOptionsItemSelected(android.view.MenuItem item) {
<span style="white-space:pre"> </span> //判定点击的菜单项是否是切换城市
<span style="white-space:pre"> </span> //构建一个意图对象
<span style="white-space:pre"> </span> //启动Activity
<span style="white-space:pre"> </span> //startActivity(intent);
<span style="white-space:pre"> </span>if(item.getItemId()==R.id.cityId){
<span style="white-space:pre"> </span>Intent intent = new Intent(this,CityActivity.class);
<span style="white-space:pre"> </span>startActivityForResult(intent,100);
<span style="white-space:pre"> </span>}
<span style="white-space:pre"> </span>
<span style="white-space:pre"> </span>return super.onOptionsItemSelected(item);
<span style="white-space:pre"> </span>}
<span style="white-space:pre"> </span>protected void onActivityResult(int requestCode, int resultCode, Intent data) {
<span style="white-space:pre"> </span>if(requestCode==100&&resultCode==200){
<span style="white-space:pre"> </span>String name=data.getStringExtra("nameKey");
<span style="white-space:pre"> </span>MenuItem.setTitle(name);
<span style="white-space:pre"> </span>}
<span style="white-space:pre"> </span>}
-------------------------------------------------------------------------------------------------------------------
ListView 的扩展对象ExpandableListView的应用
1.ExpandableListView 是什么
一个可分组的ListView
2.ExpandableListView 的应用场合
ExpandableListView 对象能够对列表分组中的
内容进行展开或收起,类似QQ中的我的好友,
我的同学,我的家人,....
3.ExpandableListView 应用的实现
1)获得ExpandableListView对象(应该在布局文件声明)
2)构建适配器对象(继承BaseExpandableListAdapter)
3)ExpandableListView关联适配器对象
4)有选择性的添加监听器(Listener)
String groups[]={"A","B","C"};
String childs[][]={{"A1","A2","A3"},{"B1","B2"},{"C1","C2"}
setContentView(R.layout.activity_main);
<span style="white-space:pre"> </span> //1.获得ExpandableListView
<span style="white-space:pre"> </span> ExpandableListView lsv=
<span style="white-space:pre"> </span> (ExpandableListView)
<span style="white-space:pre"> </span> findViewById(R.id.lsvId);
<span style="white-space:pre"> </span>//2.构建适配器对象
<span style="white-space:pre"> </span> ExpandableListAdapter adapter=
<span style="white-space:pre"> </span> new ExpAdapter();
<span style="white-space:pre"> </span>//3.关联适配器
<span style="white-space:pre"> </span> lsv.setAdapter(adapter);
lsv.setOnChildClickListener(new OnChildClickListener() {
<span style="white-space:pre"> </span>@Override
<span style="white-space:pre"> </span>public boolean onChildClick(ExpandableListView parent, View v, int groupPosition, int childPosition, long id) {
<span style="white-space:pre"> </span>Toast.makeText(getApplicationContext(),
<span style="white-space:pre"> </span>childs[groupPosition][childPosition], 0).show();
<span style="white-space:pre"> </span>return true;
<span style="white-space:pre"> </span>}
<span style="white-space:pre"> </span>});
<span style="white-space:pre"> </span>//默认展开第0个分组
<span style="white-space:pre"> </span>lsv.expandGroup(0);
class ExpAdapter extends BaseExpandableListAdapter{
<span style="white-space:pre"> </span>@Override
<span style="white-space:pre"> </span>public int getGroupCount() {
<span style="white-space:pre"> </span>return groups.length;
<span style="white-space:pre"> </span>}
<span style="white-space:pre"> </span>@Override
<span style="white-space:pre"> </span>public int getChildrenCount(int groupPosition) {
<span style="white-space:pre"> </span>return childs[groupPosition].length;
<span style="white-space:pre"> </span>}
//getItem
<span style="white-space:pre"> </span>@Override
<span style="white-space:pre"> </span>public Object getGroup(int groupPosition) {
<span style="white-space:pre"> </span>return groups[groupPosition];
<span style="white-space:pre"> </span>}
<span style="white-space:pre"> </span>@Override
<span style="white-space:pre"> </span>public Object getChild(int groupPosition, int childPosition) {
<span style="white-space:pre"> </span>return childs[groupPosition][childPosition];
<span style="white-space:pre"> </span>}
//getItemId
<span style="white-space:pre"> </span>@Override
<span style="white-space:pre"> </span>public long getGroupId(int groupPosition) {
<span style="white-space:pre"> </span>return groupPosition;
<span style="white-space:pre"> </span>}
<span style="white-space:pre"> </span>@Override
<span style="white-space:pre"> </span>public long getChildId(int groupPosition, int childPosition) {
<span style="white-space:pre"> </span>return childPosition;
<span style="white-space:pre"> </span>}
<span style="white-space:pre"> </span>/**listview中的item的id是否是稳定的*/
<span style="white-space:pre"> </span>@Override
<span style="white-space:pre"> </span>public boolean hasStableIds() {
<span style="white-space:pre"> </span>return false;//表示不稳定
<span style="white-space:pre"> </span>}
以上重写方法!
以下为包饺子
public View getChildView(int groupPosition, int childPosition, boolean isLastChild, View convertView,
ViewGroup parent) {
//1.饺子皮
View v=View.inflate(MainActivity.this,
android.R.layout.simple_list_item_1,null);
//2.饺子馅
String item=(String)
getChild(groupPosition, childPosition);
//3.包起来
((TextView)v).setText(item);
return v;
}
public boolean isChildSelectable(int groupPosition, int childPosition) {
<span style="white-space:pre"> </span>// TODO Auto-generated method stub
<span style="white-space:pre"> </span>return true;//表示子元素可以点击或选择
<span style="white-space:pre"> </span>}
<span style="white-space:pre"> </span>}
-------------------------------------------------------
GridView 的应用
1.GridView 是什么
0)View
1)ViewGroup
2)AdapterView
2.GridView 的应用场合
GridView会以网格的形式显示ITEM对象,例如
1)手机相册
2)支付宝首页
3.GridView 的构建及原理(类似ListView)
4.GridView 的应用实现(以网格显示A,B,C,D,E,F)
1)获得GridView对象(findViewById)
2)构建适配器(ArrayAdapter)
3)关联适配器(setAdapter)
GridView 常用属性
1)列的数量:android:numColumns="2"
2)水平间隙:android:horizontalSpacing="1dp"
3)垂直间隙:android:verticalSpacing="1dp"
4)列的宽度:android:columnWidth="60dp"
5)间隙模式:android:stretchMode="columnWidth"
------------------------------------------------------
Spinner
1.Spinner 是什么
0)View
1)ViewGroup
2)AdpateView
3)下拉列表
2.Spinner 应用场合
以下拉列表形式显示多个item时,可以考虑使用Spinner.
例如:
1)选择学历
2)选择颜色
3.Spinner 的构成及实现原理
类似ListView,GridView,...
4.Spinner 应用的简单实现
1)获得Spinner对象
2)构建适配器(ArrayAdapter)
3)关联适配器(setAdapter)
其它相关方法
1)setDropDownViewResource(借助此方法设置下拉列表布局)
2)getDropDownView(此方法在显示下拉列表时自动调用)
3)getSelectedItem(借助此方法获得选中的item)
4)....
5.Spinner 相关监听器
1)OnItemSelectedListener
2).......
------------------------------------------------------
ViewPager
1.ViewPager 是什么
1)View
2)ViewGroup
2.ViewPager 应用场合
以分页形式显示Item时,可以考虑使用此对象。
例如:
1)新手指导页面
2)系统广告条
3)主页面内容左右滑动时的切换
3.ViewPager 对象的构成及实现原理
1)ViewPager (Item:item view+data)
2)PagerAdapter (ViewPager借助此适配器加载数据)
4.ViewPager 的应用及相关实现
1)获得ViewPager对象(android.support.v4.view.ViewPager)
2)构建PagerAdapter对象(抽象类型,重写四个方法)
3)关联适配器对象(setAdapter)
ViewPager对象在显示数据时,会借助PagerAdapter
将数据首先要构建成Item,且在初始化时,默认会借助适配器的instantiateItem这个方法构建两个item,在ViewPager对象滑动时可能还会继续构建新的item,同时也会有一些通过destroyItem方法进行销毁。
ViewPager vp = (ViewPager) findViewById(R.id.vPagerId);
PagerAdapter pa = new PagerAdapter() {
@Override
public boolean isViewFromObject(View arg0, Object arg1) {
return arg0 == arg1;
}
@Override
public int getCount() {
return 7;
}
@Override
public Object instantiateItem(ViewGroup container, int position) {
ImageView iv = map.get(position);
if(iv == null){
iv = new ImageView(MainActivity.this);
iv.setImageResource(imgs[position]);
map.put(position, iv);
}
// ImageView iv = new ImageView(MainActivity.this);
container.addView(iv);
return iv;
}
@Override
public void destroyItem(ViewGroup container, int position, Object object) {
container.removeView((View)object);
}
<span style="white-space:pre"> </span>};@Override
<span style="white-space:pre"> </span>public void destroyItem(ViewGroup container, int position, Object object) {
<span style="white-space:pre"> </span>container.removeView((View)object);
<span style="white-space:pre"> </span>}
<span style="white-space:pre"> </span>
<span style="white-space:pre"> </span>};
<span style="white-space:pre"> </span>vp.setAdapter(pa);
PagerAdapter 相关方法说明:
1)getCount():返回ViewPapger最多显示的item的个数
2)isViewFromObject(View arg0,Object arg1):
判定instantiateItem返回的key对应的view是否是容器(ViewPager)中添加的view,此方法如何实现由instantiateItem方法的返回值决定。
3)instantiateItem(ViewGroup container, int position)
构建Item时会执行此方法,此方法用于构建item,
并将构建的item添加到viewPager容器,然后返回
一个与此item对应的一个key
4)destroyItem(ViewGroup container, int position, Object object)
销毁item时会执行此方法,此方法中通常要从viewpager
中移除对应key的item,key为参数中的object,它的值与
instantiateItem方法返回的值相同。