您的位置:首页 > 移动开发 > Android开发

Android学习 (二十三) 自定义ViewPager的适配器

2016-12-08 01:23 465 查看
很多时候ViewPager都是和fragment联合起来使用的,但是有时候也需要定义自己的适配器完成一些其他的需求。

下面就来记录一下自己自定义ViewPager适配器的过程。

其实自定义ViewPager适配器和ListView过程基本都差不多,如图,标号基本就是一个实现的顺序。



1.在activity_main.xml文件中加入ViewPager控件:

<android.support.v4.view.ViewPager
android:id="@+id/view_pager_second_activity"
android:layout_width="match_parent"
android:layout_height="wrap_content">


2.新建一个Person.java类。用来定义一些自定义的变量。

ublic class Person{
private int age = 0;
private String gender = "男";

public void setAge(int age){
this.age = age;
}

public int getAge(){
return age;
}

public void setGender(String gender){
this.gender = gender;
}

public String getGender(){
return  gender;
}
}


3.创建一个main_activity_item.xml,作为子项布局。

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">

<TextView
android:id="@+id/text_age"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />

<TextView
android:id="@+id/text_gender"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="20dp"/>
</LinearLayout>


我只写了两个控件,因为我Person类里面也只定义了两个变量。

4.接下来是很重要的一步,也是我思考时间比较久的一步。自定义适配器。其实这一步还是比较简单,重载四个函数而已。而且基本上适配器里面,如果没有其他需求的话,都是重载这四个函数。

这里我传了两个参数进来:

Activity activity:用来表示在当前的Activity中执行

List viewList:把View的实例化对象存放在了viewList里面

public class PersonSecondAdapter extends PagerAdapter{
private List<View>viewList;
private Activity activity;
//构造函数
public PersonSecondAdapter(Activity activity, List<View> viewList){
this.activity = activity;
this.viewList = viewList;
}

@Override
public boolean isViewFromObject(View arg0,Object object){//view是否来自对象
return arg0 == object;
}

@Override
public void destroyItem(ViewGroup container, int itemPosition,Object object){//销毁当前页卡
Log.d("=====destroyItem",String.valueOf(itemPosition));
container.removeView(viewList.get(itemPosition));//viewList是存放view的数据结构
}

@Override//获取当前页卡数量
public int getCount(){
if(viewList != null){
return viewList.size();
}
return 0;
}

@Override//初始化Position位置的界面
public Object instantiateItem(ViewGroup container,int itemPosition){//实例化当前页卡
Log.d("=====instantiateItem",String.valueOf(itemPosition));
container.addView(viewList.get(itemPosition));//把我刚刚新建的view传进去
return viewList.get(itemPosition);
}
}


5.这个是实现适配器和ViewPager的链接使用。主要的需要想明白的地方是:



我还是先把MainActivity.java里面的全部代码贴上再详细解答:

public class SecondActivity extends AppCompatActivity {
private List<View> viewList= new ArrayList<View>();//用来装适配器的资源
private ViewPager viewPager;//实例

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_second);

initPerson();//初始化viewList
PersonSecondAdapter myAdapter = new PersonSecondAdapter(SecondActivity.this,viewList);
ViewPager myViewPager = (ViewPager)findViewById(R.id.view_pager_second_activity);
myViewPager.setAdapter(myAdapter);
}

public void initPerson(){//给viewList添加数据

Person person1 = new Person();
View vi
c710
ew1 = null;
person1.setAge(100);
person1.setGender("男");
viewList.add(setViewListData(view1,person1));

Person person2 = new Person();
View view2 = null;
person2.setAge(19);
person2.setGender("girl");
viewList.add(setViewListData(view2,person2));

Person person3 = new Person();
View view3 = null;
person3.setAge(1865);
person3.setGender("hhh");
viewList.add(setViewListData(view3,person3));

Person person4 = new Person();
View view4 = null;
person4.setAge(88);
person4.setGender("xixixi");
viewList.add(setViewListData(view4,person4));
}

//实现把person里面的数据添加到viewList里面
public View setViewListData(View view,Person person){
view = LayoutInflater.from(SecondActivity.this).inflate(R.layout.second_activity_item,null);//把子项布局加载到view里面
TextView text1 = (TextView) view.findViewById(R.id.text_age);
TextView text2 = (TextView) view.findViewById(R.id.text_gender);
text1.setText(String.valueOf(person.getAge()));
text2.setText(person.getGender());
return view;
}

}


这里,实现这两个的对应是通过这段代码来的:



Person person1 = new Person();
//然后初始化数据
person1.setAge(100);
person1.setGender("男");
View view1 = LayoutInflater.from(SecondActivity.this).inflate(R.layout.second_activity_item,null);//把子项布局加载到view里面,注意这里有个参数null。

然后找到空间布局的id
TextView text1 = (TextView) view.findViewById(R.id.text_age);
TextView text2 = (TextView) view.findViewById(R.id.text_gender);
//把数据添加到控件里面
text1.setText(String.valueOf(person.getAge()));//注意这里的类型转换
text2.setText(person.getGender());

-------------------------------------------------------------
//以上的代码已经完成了View和Person的对应。
--------------------------------------------------------------

//把View的实例化对象view1添加到viewList里面
viewList.add(view1);


但是你会发现,每次你实例化一个Person和View对象的时候,总是会有一些代码需要重复写,所以我又写了一个函数,来避免代码的重复:

//实现把person里面的数据添加到viewList里面
public View setViewListData(View view,Person person){
view = LayoutInflater.from(SecondActivity.this).inflate(R.layout.second_activity_item,null);//把子项布局加载到view里面
TextView text1 = (TextView) view.findViewById(R.id.text_age);
TextView text2 = (TextView) view.findViewById(R.id.text_gender);
text1.setText(String.valueOf(person.getAge()));
text2.setText(person.getGender());
return view;
}


以上,为所有内容,点击运行,效果如下:

一次滑动分别为,页面1、2、3、4:







内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息