Chương 2: MÔI TRƯỜNG LẬP TRÌNH ANDROID STUDIO
2.3 Tạo giao diện (layout) chương trình trong Android Studio
2.3.5 Xây dựng layout với Adapter
Khi nội dung cho layout của bạn là kiểu động hoặc không xác định trước, bạn có thể sử dụng một layout là lớp con AdapterView để bố trí cho view tại thời điểm chương trình chạy. Một lớp con của lớp AdapterView sử dụng một Adapter để kết nối dữ liệu tới layout của nó. Adapter hoạt động như một người trung gian giữa các nguồn dữ liệu và layout AdapterView - Adapter lấy dữ liệu (từ một nguồn ví dụ nhƣ một mảng hoặc một truy vấn cơ sở dữ liệu) và chuyển đổi từng mục vào một view mà có thể đƣợc thêm vào trong layout AdapterView.
Layout phổ biến đƣợc hỗ trợ bởi adapter bao gồm :
List View Grid View
Hiển thị danh sách trên một cột duy nhất có thể cuộn (lên hoặc xuống)
Hiển thị một lưới (bao gồm các hàng và cột) có thể cuộn
61
Đổ dữ liệu vào adapter view
Bạn có thể điền một AdapterView nhƣ ListView hoặc GridView bằng cách gắn một thực hiện AdapterView vào Adapter – thứ dùng để nhận dữ liệu từ một nguồn bên ngoài và tạo ra một View đại diện cho từng mục dữ liệu.
Android cung cấp một số lớp con của Adapter, rất hữu ích cho việc lấy các loại dữ liệu khác nhau và xây dựng cho view cho AdapterView. Hai adapter phổ biến nhất là:
a) ArrayAdapter
Sử dụng adapter này khi nguồn dữ liệu của bạn là một mảng. Theo mặc định, ArrayAdapter, tạo view cho từng item trong array bằng cách gọi phương thức toString() trên mỗi item và đặt nội dung trong một TextView.
Ví dụ, nếu bạn có một mảng chuỗi (string) bạn muốn hiển thị trong một ListView, khởi tạo một ArrayAdapter mới sử dụng một hàm khởi tạo (constructor) để chỉ định layout cho từng chuỗi và mảng chuỗi (string array):
ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, myStringArray);
Các đối số trong hàm khởi tạo này là:
- Context ứng dụng của bạn
- Layout có chứa một TextView cho từng chuỗi trong mảng - Mảng chuỗi
Sau đó chỉ cần gọi setAdapter() trên ListView của bạn:
ListView listView = (ListView) findViewById(R.id.listview);
listView.setAdapter(adapter);
Để tùy chỉnh sự xuất hiện của từng item, bạn có thể ghi đè lên phương thức toString() cho các đối tƣợng trong mảng của bạn. Hoặc, để tạo ra một view cho từng item với là một cái gì đó khác hơn là một TextView (ví dụ, nếu bạn muốn một ImageView cho mỗi item trong mảng), mở rộng lớp ArrayAdapter và ghi đè getView() để trả về kiểu view bạn muốn cho mỗi mục.
62
a) SimpleCursorAdapter
Sử dụng adater này khi dữ liệu của bạn đến từ một con trỏ (Cursor). Khi sử dụng SimpleCursorAdapter, bạn phải xác định layout sử dụng cho từng hàng trong Cursor và cột nào trong Cursor nên đƣợc chèn vào view nào của layout. Ví dụ, nếu bạn muốn tạo ra một danh sách các tên người và số điện thoại, bạn có thể thực hiện một truy vấn mà trả về một con trỏ chứa một hàng cho mỗi người và các cột cho tên và số điện thoại. Sau đó bạn tạo một mảng chuỗi, chỉ rõ cột nào trong Cursor bạn muốn xuất hiện trong layout và một mảng số nguyên xác định những view tương ứng với mỗi cột sẽ được bố trí vào:
String[] fromColumns = {ContactsContract.Data.DISPLAY_NAME, ContactsContract.CommonDataKinds.Phone.NUMBER};
int[] toViews = {R.id.display_name, R.id.phone_number};
Khi bạn khởi tạo các SimpleCursorAdapter, truyền layout sử dụng cho từng kết quả, Cursor chứa các kết quả, và hai mảng này:
SimpleCursorAdapter adapter = new SimpleCursorAdapter(this,
R.layout.person_name_and_number, cursor, fromColumns, toViews, 0);
ListView listView = getListView();
listView.setAdapter(adapter);
Sau đó SimpleCursorAdapter tạo ra view cho từng hàng trong Cursor bằng cách sử dụng layout đƣợc cung cấp bằng cách chèn từng mục fromColumns vào toViews tương ứng.
Nếu trong quá trình chạy ứng dụng của bạn, bạn thay đổi các dữ liệu cơ bản đƣợc đọc bởi adapter, bạn nên gọi notifyDataSetChanged(). Điều này sẽ thông báo cho view rằng các dữ liệu đã đƣợc thay đổi và nó sẽ tự làm mới lại với các thay đổi.
Xử lý sự kiện click
Bạn có thể phản hồi các sự kiện click trên mỗi item trong một AdapterView bằng cách thực hiện các giao tiếp AdapterView.OnItemClickListener. Ví dụ:
63 // Create a message handling object as an anonymous class.
private OnItemClickListener mMessageClickedHandler = new OnItemClickListener() { public void onItemClick(AdapterView parent, View v, int position, long id) { // Do something in response to the click
} };
listView.setOnItemClickListener(mMessageClickedHandler);