Android 控件演示 - 自定义ListView

Android 控件演示 - ListView 中,演示了 ListView 最简单的用法,本文演示在 ListView 中用自定义样式显示数据。

定义要显示的数据

在Java中,习惯用 POJO 的方式来表达数据,在本例中,我们也定义一个类来表示数据:

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

private Integer id;

private String title;

private String desc;

private Boolean done = false;

public Todo(Integer id, String title) {
this.id = id;
this.title = title;
}

// ... 省略众多的 get/set 方法
}

定义显示样式

在 ListView 中,如果使用的是自定的数据类型,也需要自定义对应的 Adapter。
新建一个 layout 文件,用于描述 Toast 将要如何显示。 选择 app, 右键选择 New -> XML -> Layout XML File。
根据提示为文件命名并选择布局管理器。 示例中文件命名为: list_todo_layout.xml。让后简单的加一个 TextView , 最后的文件内容为:

1
2
3
4
5
6
7
8
9
10
11
12
13
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">

<TextView
android:id="@+id/todo_title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:layout_marginLeft="10dip" />

</LinearLayout>

定义 Adapter

现在有了数据类型,也有了显示样式,怎么样把它们组合起来让 ListView 显示呢? 这个时候就需要用到自定义的 Adapter 了。

先看代码:

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

private final int resourceId;

public TodoAdapter(Context context, int resourceId, List<Todo> data) {
super(context, resourceId, data);
this.resourceId = resourceId;
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {
Todo todo = (Todo) getItem(position);
View view = LayoutInflater.from(getContext()).inflate(resourceId, null);
TextView twTitle = (TextView) view.findViewById(R.id.todo_title);
twTitle.setText(todo.getTitle());
return view;
}
}

在构造函数中,我们将 resourceId 作为参数传递给 Adapter 类, 从后面的代码我们可以知道,这个 resourceId 其实就是显示样式文件对应的id。在 getView 方法中,载入屏幕样式文件并作为一个View对象,在从 View 中获取 TextView, 最后把数据赋值给 TextView。

显示 ListView

为了显示自定义的 ListView, 我们使用在 Android 控件演示 - ListView 中定义好的 Activity, 修改 Activity 类的代码如下即可:

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
public class TodoListActivity extends AppCompatActivity {

private List<Todo> todos = new ArrayList<Todo>();

@BindView(R.id.todoList) ListView listView;

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

ButterKnife.bind(this);

initTodos();
TodoAdapter adapter = new TodoAdapter(TodoListActivity.this, R.layout.list_todo_layout, todos);
listView.setAdapter(adapter);

}

private void initTodos() {

for(int i = 1; i <= 50; i++) {
Todo t = new Todo(i, "task" + i);
todos.add(t);
}

}
}

本文标题:Android 控件演示 - 自定义ListView

文章作者:晨星

发布时间:2019年08月11日 - 17:08

最后更新:2020年09月16日 - 08:09

原始链接:https://www.mls-tech.info/app/android/android-widget-custom-listview/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。