在 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; }
}
|
定义显示样式
在 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); }
} }
|