【笔记】Android控件ListView

前言

Android控件ListView学习笔记

添加ListView控件

/app/src/main/res/layout/activity_main.xml
1
2
3
4
5
6
7
8
9
10
11
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">

<ListView
android:id="@+id/lv"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />

</LinearLayout>

自定义一个布局

  • 创建一个布局list_item.xml,用于存放列表内的元素
    • 布局内添加一个TextView控件,用于存放列表
/app/src/main/res/layout/list_item.xml
1
2
3
4
5
6
7
8
9
10
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">

<TextView
android:id="@+id/tv"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />

</LinearLayout>

创建一个Bean类

  • 创建一个Bean类,用于创建列表元素对象
    • Bean的属性为name,用于定义列表元素的值
/app/src/main/java/.../Bean.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public class Bean {

private String name;

public Bean(String name) {
this.name = name;
}

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

}

创建一个适配器类

  • 创建一个适配器类,继承BaseAdapter类,用于把列表中元素放到列表中
/app/src/main/java/.../MyAdapter.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
public class MyAdapter extends BaseAdapter {

private List<Bean> beans;
private Context context;

public MyAdapter(List<Bean> beans, Context context) {
this.beans = beans;
this.context = context;
}

// 获取元素个数
@Override
public int getCount() {
return beans.size();
}

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

// 获取元素编号
@Override
public long getItemId(int i) {
return i;
}

// 设置适配器回显的内容
@Override
public View getView(int i, View view, ViewGroup viewGroup) {
// 如果界面中不存在列表当前元素才渲染
if (view == null) {
view = LayoutInflater.from(context).inflate(R.layout.list_item, viewGroup, false);
}
// 把列表元素的name属性渲染到TextView控件上
TextView textView = view.findViewById(R.id.tv);
textView.setText(beans.get(i).getName());
return view;
}
}

优化(可选)

  • 由于findViewById()大量耗时,所以可以创建一个viewHolder对象,用于存储findViewById()获取后的对象
    • 此时当列表元素未被findViewById()获取过时,立即使用findViewById()获取对象,并将获取的对象存入viewHoler
    • 此时当列表元素已被findViewById()获取过时,直接获取viewHolder对象中存储的对象
/app/src/main/java/.../MyAdapter.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
@Override
public View getView(int i, View view, ViewGroup viewGroup) {
ViewHolder viewHolder;
// 如果界面中不存在列表当前元素
if (view == null) {
// 实例化viewHolder
viewHolder = new ViewHolder();
// 获取view
view = LayoutInflater.from(context).inflate(R.layout.list_item, viewGroup, false);
// 把获取到的TextView对象放到viewHolder中存储
viewHolder.textView = view.findViewById(R.id.tv);
// 设置view的标签为viewHolder
view.setTag(viewHolder);
}
// 如果界面中存在列表当前元素
else {
// 获取view的标签,放到当前viewHolder中
viewHolder = (ViewHolder) view.getTag();
}
// TextView textView = view.findViewById(R.id.tv);
// 把列表元素的name属性渲染到TextView控件上
viewHolder.textView.setText(beans.get(i).getName());
return view;
}

// 创建一个内部类,用于存放已获取的TextView对象
private final class ViewHolder {
TextView textView;
}

实例化对象

  • 在主类中创建列表元素对象,并通过自定义的适配器,将列表元素渲染到列表中
/app/src/main/java/.../MyActivity.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
public class MainActivity extends AppCompatActivity {

// 创建一个存放多个列表元素的集合
private List<Bean> beans = new ArrayList<>();

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

// 创建多个列表元素对象,并添加到集合中
beans.add(new Bean("文本内容"));
...

// 获取列表对象
ListView listView = findViewById(R.id.lv);
// 设置列表对象的适配器为自定义适配器,传递列表元素的集合
listView.setAdapter(new MyAdapter(beans, this));

}
}

为列表元素添加点击方法

/app/src/main/java/.../MyActivity.java
1
2
3
4
5
6
7
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
// 打印列表元素的编号(从0开始)
System.out.println(i);
}
});

完成

参考文献

哔哩哔哩——Android架构解析