BẮT SỰ KIỆN TRONG LISTVIEW
Khi làm việc với ListView, bất kỳ một ứng dụng nào, cũng phải tương tác với dữ liệu trong ListView đó. Nói cách khác, ta phải bắt sự kiện trong ListView khi người dùng chọn một item bất kỳ.
Đến với bài viết này, Hocweb sẽ giới thiệu với các bạn cách bắt sự kiện trong ListView. Để tiếp tục bài viết, các bạn có thể xem lại Phần 1 ở đây (List View trong Android). Ta sẽ tìm hiểu bài viết qua các nội dung chính sau.
Mục lục bài viết:
1. Các cách bắt sự kiện trong ListView
2. Tương tác với item trong ListView
3. Một số lưu ý khi bắt sự kiện trong ListView
1. Thêm một item mới trong ListView
Ở bài viết trước, ta đã xây dựng được một ListView như hình vẽ trên. Ta hoàn toàn chưa cài đặt code để bắt sự kiện khi người dùng tương tác vào dữ liệu trên màn hình. Để bắt sự kiện tương tác đó, ta có hai cách cài đặt code như sau:
- Cài đặt Code trực tiếp trong lớp Adapter mà ta đã tạo
Ta đã biết, Adapter mà ta tạo được kế thừa từ BaseAdapter. Trong đó, ta cần định nghĩa lại hàm getCount(), getItemId(), getItem() và getView(). Để bắt sự kiện người dùng tương tác với item, ta tập trung vào hàm getView(). Tương tự khi cài sự kiện OnClick cho Button, ta cũng cài sự kiện OnClick cho convertView trong hàm getView() như sau:
convertView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { //xử lý khi người dùng tương tác vào item } });
- Cài đặt Code nằm ngoài Adapter mà ta đã tạo
Khác với cài đặt code nằm trong Adapter, đoạn code này nằm trong file java của Activity hiển thị ListView. Trường hợp này ta sẽ gọi listView (ListView đã được setAdapter) và set sự kiện setOnItemClickListener() cho nó, như bên dưới:
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { //Xử lý khi người dùng tương tác đế item thứ position } });
2. Tương tác với item trong ListView
Như đã trình bày, ta có hai cách để tương tác với dữ liệu của item trong ListView. Tuy nhiên, phần code xử lý trong hai cách là tương tự nhau. Ví dụ, ta sẽ cho ứng dụng hiện thông báo với nội dung “Bạn dã chọn nước …” khi người dùng tương tác với một item bất kỳ trong ListView.
- Cài đặt Code trực tiếp trong lớp Adapter mà ta đã tạo
convertView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Toast.makeText(context,"Bạn đã chọn nước "+getData()[position].getTennuoc(),Toast.LENGTH_LONG).show(); } });
- Cài đặt Code nằm ngoài Adapter mà ta đã tạo
private void onClick() { listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { Toast.makeText(MainActivity.this,"Bạn đã chọn nước "+ ((AdapterListView)(parent.getAdapter())).getData()[position].getTennuoc(),Toast.LENGTH_LONG).show(); } }); }
Lưu ý, để lấy dữ liệu Adapter trong parent, ta dùng hàm getAdapter() và ép Adapter đó về AdapterListView (lớp ta đã tạo), và dùng getData() để lấy dữ liệu trong ListView. Lúc này dữ liệu ta lấy được là một Mảng các Country. Để lấy tên nước, ta chỉ cần code theo mảng một chiều bình thường như trên.
3. Một số lưu ý khi bắt sự kiện trong ListView
Ví dụ xuất một thông báo là rất đơn giản. Tuy nhiên, ta cần làm nhiều chức năng hơn. Ví dụ, một ListView dữ liệu có thể Thêm, Cập nhật, Xoá dữ liệu. Đừng quá bận tâm, chỉ cần thao tác như thao tác trên Mảng hoặc trên List (tuỳ trường hợp dữ liệu đầu vào). Quan trọng là ta phải notify lại dữ liệu bằng hàm .notifyDataSetChanged().
Gỉa sử, ngay trong lớp AdapterListView, ta muốn xoá một item khi chạm vào nó trong ListView, code mẫu như sau:
convertView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Country[] oldCountries = getData(); Country[] newCountries = new Country[oldCountries.length-1]; for(int i =0;i<newCountries.length;i++) if(i<position) newCountries[i] = oldCountries[i]; else newCountries[i] = oldCountries[i+1]; setData(newCountries); notifyDataSetChanged(); } });
Ta cũng có thể thay đổi dữ liệu đầu vào sang một List<Country> để các thao này dễ dàng hơn.