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

来源:互联网 发布:切换输入法快捷键mac 编辑:程序博客网 时间:2024/04/29 21:13

很多时候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 view1 = 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:
这里写图片描述

这里写图片描述

这里写图片描述

这里写图片描述

0 0