自定义Adapter
这个是ListView中使用最多的一个Adapter适配器,因为我们可以根据自己的意愿去创建数据和数据的布局样式。使用方式灵活,下面我们来学习一下自定义Adapter的具体步骤:
One.自定义的Adapter依然遵循MVC设计模式,首先我们来创建数据Model。
创建一个学生类:
public class Student {
/*
定义学生的构造器,创建学生对象时定义学生的信息。
*/
public Student(String name, String age, String sex, String hobby,int imag){
this.name = name;
this.age = age;
this.sex = sex;
this.hobby = hobby;
this.imag = imag;
}
private int imag; //学生照片
private String name;//学生姓名
private String age;//学生年龄
private String sex;//学生性别
private String hobby;//学生爱好
public int getImag() {
return imag;
}
public void setImag(int imag) {
this.imag = imag;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAge() {
return age;
}
public void setAge(String age) {
this.age = age;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public String getHobby() {
return hobby;
}
public void setHobby(String hobby) {
this.hobby = hobby;
}
}
Two. 定义数据的布局方式,也就是数据的View。
在这里我们定义他的布局方式如下图:
布局前段时间添加的是错的,多谢@java小酱油啊 小伙伴提醒哦,已修改……
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_margin="20dp"
android:gravity="center|left">
<ImageView
android:id="@+id/image_photo"
android:layout_width="70dp"
android:layout_height="70dp" />
<TextView
android:id="@+id/textview_name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="姓名"
android:textStyle="bold"
android:textColor="#0e99ff"
android:textSize="20sp" />
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical"
android:layout_marginRight="15dp"
android:layout_marginLeft="15dp">
<TextView
android:id="@+id/textview_age"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="性别"
android:textStyle="bold"
android:textColor="#009900"
android:textSize="15sp"/>
<TextView
android:id="@+id/textview_sex"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="年龄"
android:textStyle="bold"
android:textColor="#ff99ff"
android:textSize="15sp" />
</LinearLayout>
<TextView
android:id="@+id/textview_hobby"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="爱好"
android:textStyle="bold"
android:textColor="#55eedd"
android:textSize="20sp" />
</LinearLayout>
Three.自定义Adapter,创建一个类继承BaseAdapter。因为BaseAdapter中有四个抽象的方法:public int getCount(), public Object getItem(int position), public long getItemId(int position), public View getView(int position, View convertview,ViewGroup viewGroup),因此在继承BaseAdapter类后必须实现这四个方法。
public int getCount():
是用来返回数据的数量的。
public Object getItem(int position):
该方法使用来获得每一条ListView中的Item的,这里我们返回position即可,position是指每条Item在ListView中的位置(0, 1, 2……)。
public long getItemId(int position):
该方法是来获得ListView中每条Item的Id的,这里我们依然返回position即可。
public View getView(int position, View convertview, ViewGroup viewGroup):
该方法是自定义Adapter最重要的方法,在这个方法中我们需要将数据一一对应的映射或者添加到我们自己定义的View中。然后返回view。
public class StudentAdapter extends BaseAdapter{
private List<Student> mData;//定义数据。
private LayoutInflater mInflater;//定义Inflater,加载我们自定义的布局。
/*
定义构造器,在Activity创建对象Adapter的时候将数据data和Inflater传入自定义的Adapter中进行处理。
*/
public StudentAdapter(LayoutInflater inflater,List<Student> data){
mInflater = inflater;
mData = data;
}
@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 viewGroup) {
//获得ListView中的view
View viewStudent = mInflater.inflate(R.layout.item_simpleadapter,null);
//获得学生对象
Student student = mData.get(position);
//获得自定义布局中每一个控件的对象。
ImageView imagePhoto = (ImageView) viewStudent.findViewById(R.id.image_photo);
TextView name = (TextView) viewStudent.findViewById(R.id.textview_name);
TextView age = (TextView) viewStudent.findViewById(R.id.textview_age);
TextView sex = (TextView) viewStudent.findViewById(R.id.textview_sex);
TextView hobby = (TextView) viewStudent.findViewById(R.id.textview_hobby);
//将数据一一添加到自定义的布局中。
imagePhoto.setImageResource(student.getImag());
name.setText(student.getName());
age.setText(student.getAge());
sex.setText(student.getSex());
hobby.setText(student.getHobby());
return viewStudent ;
}
}
Four:在Activity中初始化数据,然后创建自定义的Adapter的对象,通过setAdapter()方法将自定义的布局加载到ListView中。
public class BaseAdapterActivity extends Activity {
//定义数据
private List<Student> mData;
//定义ListView对象
private ListView mListViewArray;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_list);
//为ListView对象赋值
mListViewArray = (ListView) findViewById(R.id.listview_array);
LayoutInflater inflater =getLayoutInflater();
//初始化数据
initData();
//创建自定义Adapter的对象
StudentAdapter adapter = new StudentAdapter(inflater,mData);
//将布局添加到ListView中
mListViewArray.setAdapter(adapter);
}
/*
初始化数据
*/
private void initData() {
mData = new ArrayList<Student>();
Student zhangsan = new Student("张三", "30", "男", "喜欢玩游戏",R.mipmap.header_icon );
Student lisi = new Student("李四", "18", "女", "喜欢读书",R.mipmap.header_icon );
Student wangwu = new Student("王五", "25", "男", "喜欢运动",R.mipmap.header_icon );
Student zhaoliu = new Student("赵六", "22", "男", "喜欢吃饭",R.mipmap.header_icon );
mData.add(zhangsan);
mData.add(lisi);
mData.add(wangwu);
mData.add(zhaoliu);
}
}
结果显示为:(练习使用请不要嫌我做的丑好咩……)