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

很多时候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
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值