自定义Adapter

在进行安卓开发的时候使用arrayadapter和simpleadapter显示数据的方式比较固定,如果我们想对listview进行更加丰富的展示,那么我们就要使用自定义adapter了,比如说使用自定义adapter可以实现item单双行背景颜色不同等,那么 我们就来看看如何自定义adapter吧

首先展示一张自定义adapter的步骤图(自己写的)


使用自定义adapter可以实现展示数据更加丰富的listview,我这里就暂且定位自定义listview了,首先第一步我们需要创建一个数据模型,这个数据模型通常是一个数据类,比如说的listview要展示一些用户的信息,那么你就要定义一个用户类,包含了用户的各个属性,我这里暂且定义了一个people类,如下

public class People {
    private String name;
    private String sex;
    private  int image;
    private String hobby;
    public int getImage() {
        return image;
    }
    public String getHobby() {
        return hobby;
    }
    public String getName() {
        return name;
    }
    public String getSex() {
        return sex;
    }
    public People(String name,String sex,int image,String hobby){
        this.name = name;
        this.image = image;
        this.sex = sex;
        this.hobby = hobby;
    }
}

由以上代码可以看出我们定义了一个数据类people类,包含了一个人的姓名,性别,头像和爱好,那么紧接着第二步我们要定义一个数据的布局样式,也即是创建一个xml文件用来显示数据,如何显示就如何设置这个布局,如下

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="50dp"
    android:background="#848282">
    <ImageView
        android:layout_width="50dp"
        android:layout_height="match_parent"
        android:id="@+id/item_icon"
        android:src="@mipmap/ic_launcher"/>
    <TextView
        android:layout_width="50dp"
        android:layout_height="match_parent"
        android:text="张三"
        android:textSize="24sp"
        android:gravity="center"
        android:id="@+id/item_name"/>
    <TextView
        android:id="@+id/item_sex"
        android:layout_width="50dp"
        android:layout_height="match_parent"
        android:layout_marginLeft="10dp"
        android:text="男"
        android:textSize="24sp"
        android:gravity="center"
        android:textColor="#e41515"/>
    <TextView
        android:layout_width="200dp"
        android:layout_height="match_parent"
        android:text="喜欢打游戏"
        android:textSize="20sp"
        android:id="@+id/item_hobby"/>
</LinearLayout>

进行到这里我们就来到最重要的一步自定义adapter,这个步骤是要求我们创建一个类继承baseadapter,需要我们重写它的四个抽象方法,最重要的是他的getview方法代码如下

public class MyAdapter extends BaseAdapter {
    private int[] colors = new int[] { 0xff3cb371, 0xffa0a0a0 };
    //创建数据
    private List<People> mData;
    //创建布局管理器
    private LayoutInflater inflater;
    public MyAdapter(LayoutInflater inflater,List<People>data){
        this.mData = data;
        this.inflater = inflater;
    }
    @Override
    public int getCount() {
        return mData.size();
    }

    @Override
    public Object getItem(int position) {
        return position;
    }

    @Override
    public long getItemId(int position) {
        return position;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {

        //获得listview中的view,也即是每一个item
        View view = inflater.inflate(R.layout.itemlistview,null);
        //获得一个自定义数据对象
        People people = mData.get(position);
        //获得自定义布局中每一个控件对象
        ImageView item_icon = (ImageView)view.findViewById(R.id.item_icon);
        TextView item_name = (TextView)view.findViewById(R.id.item_name);
        TextView item_sex = (TextView)view.findViewById(R.id.item_sex);
        TextView item_hobby = (TextView)view.findViewById(R.id.item_hobby);
        //将数据一一添加到自定义的布局中
        item_hobby.setText(people.getHobby());
        item_icon.setImageResource(people.getImage());
        item_name.setText(people.getName());
        item_sex.setText(people.getSex());
        int colorPos = position % colors.length;
        view.setBackgroundColor(colors[colorPos]);
        return view;
    }
}
要很好的掌握自定义adapter我觉得我们需要对这四个抽象方法与一个清楚地了解,接下来让我们一同看一下这四个抽象方法吧

第一个是getCount,这个方法是什么意思呢,count是总数的意思,所以这个方法代表获得数据的总数量,第二个方法和第三个方法我们直接返回position即可,最重要的是第四个方法getview方法,这个方法是整个自定义adapter的核心,它返回的是自定义布局中的每一个item的view,我们需要在这个方法中获得listview中的view,也即是每一个item,获得自定义布局中的每一个控件对象以及将数据一一添加到自定义的布局中,具体的大家可以仔细研究一下上面的代码,adapter是连接前端显示和后台数据的一个桥梁,所以我们在自定义adapter的时候也要重点处理布局(前端显示)和数据(后台数据)两部分内容,数据我们采用list集合,而集合中的每一项数据就是我们自定义的数据类的一个对象,这里是我们定义的people类。

以上代码显示的最终效果是











原文地址:https://www.cnblogs.com/ithuangqing/p/12113708.html