Android 自定义 item 的 ListView

从 iOS 的 TableView 突然转到 Android 的 ListView, 说实话,很恶心。各种不方便,不要问我为什么学 Android,我也不想,唉,牢骚归牢骚,既然学了,就得学到点什么,不然既浪费时间,又什么都没得到,太亏了。记录一下学习的历程。

在使用 ListView 的时候,大部分我们都会自定义 item,iOS 也一样,会自定义 cell。不然使用系统为我们提供的几种格式是满足不了我们的各式各样的需求的。

废话到此为止。

1.先在 xml 文件中布局:

1
2
3
4
5
6
7
<ListView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/main_listView"
android:layout_alignParentTop="true"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true" />

2.创建模型文件

相当于 iOS 中的 model 文件,每写一个东西,就得去 iOS 中找对应的东西,这属于思维固化了。慢慢改正,不过这样能方便快速的理解这些东西。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public class Teacher {

private String name;
private int imageID;

//setter和getter方法
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getImageID() {
return imageID;
}
public void setImageID(int imageID) {
this.imageID = imageID;
}
}

相比较而言,Android 的模型文件真的很麻烦,定义一个属性,就得写它的 getter 和 setter 方法。也许有其他的办法,只是我还不知道。

3.创建Adapter

这个适配器,在我的理解中就相当于 iOS 中的自定义 cell 了,比 iOS 方便的是,iOS 的那些数据源方法都在这里实现。一般的话,自定义的 adapter 会继承于 BaseAdapter

1.实现数据源方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
@Override
public int getCount() {
//返回多少行数据
return mList.size();
}

@Override
public Object getItem(int position) {
//获取每一行的数据
return mList.get(position);
}

@Override
public long getItemId(int position) {
//获取行号
return position;
}

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

//UI 刷新的代码主要在这里实现
return null;
}

2.创建一个构造方法

这里是举例说明:

1
2
3
4
public TeacherAdapter(ArrayList<Teacher> mList, Context mContext) {
this.mList = mList;
this.mContext = mContext;
}

4.给 item 布局

创建一个 item 的 xml 文件,每一个 item 的布局都在这个文件中进行。

1
2
3
4
5
6
7
8
9
10
11
12
13
<ImageView
android:layout_width="50dp"
android:layout_height="50dp"
android:id="@+id/item_imageView"
android:layout_marginTop="5dp"
android:layout_marginLeft="10dp"/>

<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/item_textView"
android:layout_marginLeft="10dp"
android:layout_gravity="center_vertical"/>

这里我给每个 item 上定义了两个控件,一个 TextView,一个 ImageView。是线性布局。

5.给控件赋值

接下来再回到 adapter 文件中的 getView 方法中,在这个方法中为控件赋值。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
@Override
public View getView(final int position, View convertView, ViewGroup parent) {

//UI 刷新的代码主要在这里实现
//获取老师的数据
final Teacher teacher = mlist.get(position);

//根据layout文件创建布局
View oneTeacherView = LayoutInflater.from(mContext).inflate(R.layout.teacher_item,parent,false);

//获取ImageView和TextView
ImageView imageView = (ImageView) oneTeacherView.findViewById(R.id.item_imageView);
TextView textView = (TextView) oneTeacherView.findViewById(R.id.item_textView);

//根据数据分别为imageView和textView赋值 imageView.setImageResource(teacher.getImageID());
textView.setText(teacher.getName());

return oneTeacherView;
}

6.设置数据源

接下来回到 Activity 文件中,获取 listView 对象:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
//因为这里是本地数据,所以将 listView 设置为了局部变量,本地数据也不需要在开启线程去刷新UI

ArrayList<Teacher> teacherList = new ArrayList<Teacher>();

Teacher teacher = new Teacher();
teacher.setName("jack");
teacher.setImageID(R.mipmap.header_image);

teacherList.add(teacher);

//我这里只添加了一条数据,如果像添加的话,添加进这个数组就行
ListView listView = (ListView)findViewById(R.id.main_listView);

TeacherAdapter adapter = new TeacherAdapter(teacherList,this);

listView.setAdapter(adapter);

到这里,一个完整的自定义 item 的 ListView 算是完成了。但是在实际开发中,大部分的应用场景都是从网络端获取数据,然后给 ListView 赋值。这个等我学到网络的时候再来介绍一下。

如有不对之处,请多多指正!达者为师,谢谢!

-------------本文结束感谢您的阅读-------------
分享使我快乐!