make-money-468x60

Tìm hiểu về listview trong android

Trong Android để hiển thị tập hợp nhiều phần tử cùng loại, ta dùng danh sách. Có 2 loại danh sách được định nghĩa sẵn là ListView  SpinnerView. Trong phần này ta sẽ lần lượt xem xét từng loại danh sách này.

ListView

ListView hiển thị danh sách các đối tượng con dưới dạng danh sách dọc, có khả năng cuộn khi chiều dài danh sách vượt quá chiều cao của view mẹ. Ta sẽ xem xét ListView trong trường hợp đơn giản nhất: hiển thị danh sách các phần tử dạng chữ.
Trước tiên, ta chuẩn bị mảng dữ liệu các chữ cần hiển thị trong danh sách. Ta có thể nhập cứng (hard code) danh sách này trong mã nguồn java của Activity như sau.


String[] presidents= {
        "Dwight D. Eisenhower",
        "John F. Kennedy",
        "Lyndon B. Johnson",
        "Richard Nixon",
        "Gerald Ford",
        "Jimmy Carter",
        "Ronald Reagan",
        "George H. W. Bush",
        "Bill Clinton",
        "George W. Bush",
        "Barack Obama"
};
  

Tuy nhiên cách làm này làm cho mã nguồn rối hơn, gây khó khăn cho việc bảo trì, cũng như hạn chế khả năng địa phương hóa (thay đổi ngôn ngữ cho ứng dụng). Vì vậy, trong lập trình Android, phương pháp được khuyên dùng là định nghĩa các dữ liệu tĩnh này trong thư mục “res”. Cụ thể, đối với mảng chữ như trên, ta có thể định nghĩa trong file “res/values/string.xml” như sau:



    Hello World, BasicViews5Activity!
    BasicViews5
    
        Dwight D. Eisenhower
        John F. Kennedy
        Lyndon B. Johnson
        Richard Nixon
        Gerald Ford
        Jimmy Carter
        Ronald Reagan
        George H. W. Bush
        Bill Clinton
        George W. Bush
        Barack Obama
    


Sau đó, trong mã nguồn Java, ta có thể dễ dàng lấy ra mảng này bằng cách như sau:

String[] presidents;
presidents = getResources().getStringArray(R.array.presidents_array);

Để tạo một danh sách, trước tiên ta khai báo 1 ListView trong file layout của Activity:








Đối với Activity có một ListView bên trong, Android định nghĩa sẵn lớp con của Activity là ListActivity giúp cho quá trình làm việc với ListView trở đơn giản hơn. Để có thể dụng được ListActivity này, có 2 việc cần phải làm:
  • Activity phải kế thừa từ lớp android.app.ListActivity
  • ListView trong file layout của Activity phải có id là "@+id/android:list"
Mã nguồn của Activity sẽ như sau:

public class BasicViews5Activity extends ListActivity  {

    String[] presidents;

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.main);

        presidents =
                getResources().getStringArray(R.array.presidents_array);

        setListAdapter(new ArrayAdapter(this,
            android.R.layout.simple_list_item_checked, presidents));
    }

    @Override
    public void onListItemClick(
    ListView parent, View v, int position, long id)
    {
        Toast.makeText(this,
            "You have selected " + presidents[position],
            Toast.LENGTH_SHORT).show();
    }
}

ListView trong Android cũng lấy nội dung từ một Adapter giống như trường hợp của Gallery ta đã làm quen trước đó. Đối với ListActivity, ta không cần lấy tham chiếu đến ListView một cách minh bạch, mà có thể gọi thẳng hàm setListAdapter để đặt adapter cho listView trong Activity (được đặt id theo quy định như đã nói ở trên).
Để xử lý sự kiện người dùng bấm chọn một phần tử trong ListView, ta chỉ cần nạp chồng hàmonListItemClick như đoạn mã ở trên. Trong ví dụ này ta chỉ đơn thuần in ra chữ của phần tử được chọn.
Activity trên khi chạy trên emulator sẽ có dạng như sau:
 Ta có thể vuốt lên/xuống màn hình để xem toàn bộ danh sách. Có rất nhiều tùy chọn có thể làm với ListView. Bạn đọc tự tìm hiểu coi như bài tập. Ở đây ta chỉ nói thêm một tính khả năng của ListView cho phép lựa chọn nhiều phần tử cùng lúc (multi-item selection). Để bật tính năng này, ta chỉ cần gọi hàmsetChoiceMode của ListView như sau:


ListView lstView = getListView();
lstView.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);

ListView với thuộc tính lựa chọn nhiều phần tử được bật sẽ có dạng như sau: