[ListView] Custom ListView trong android

ListView là một trong những component quan trọng không thể thiếu trong ứng dụng android. Bài viết này chúng ta sẽ cùng nhau xây dựng ứng dụng cơ bản sử dụng ListView trong android và custom ListView trong android đảm bảo hiệu suất cao.

Nếu các bạn đã từng thao tác với các component như GridView, Spinner và xây dựng các AdapterView cho nó thì việc xây dựng ListView cũng tương tự như vậy.

kenhlaptrinh-net_listview

1. Giới thiệu về Listview trong android

ListView là 1 GroupView sẽ giúp chúng ta hiển thị 1 dữ liệu lên màn hình dưới dạng 1 danh sách (có thể theo chiều đứng, hoặc nằm ngang). Vậy để xây dựng 1 ListView ta cần những gì? 

Thứ nhất:  Về dữ liệu ta cần phải tổ chức dưới dạng 1 mảng dữ liệu: ta có thể sử dụng ArrayList<Object>, hoặc LinkedList, Enum, Cursor.

Thứ hai: Về ListView ta sẽ khai báo 1 thẻ ListView trong activity cần hiển thị và mapping nó tới Class xử lý.

Thứ ba: itemViews  là 1 file layout.xml trong resource layout là giao diện các item mà ta muốn hiển thị. Dữ liệu của từng đối tượng trong mảng dữ liệu sẽ được hiển thị trên item này tùy vào yêu cầu người xây dựng.

Thứ tư: Adapter là 1 lớp khai báo các itemView và mapping dữ liệu từ các đối tượng trong mảng dữ liệu và hiển thị lên ListView trên activity. Đây cũng là thành phần quan trọng nhất trong phần bài viết này mà mình muốn nhấn mạnh. Vì khi xây dựng 1 listView để đảm bảo được hiệu năng và trải nghiệm người dùng tốt nhất thì nó hoàn toàn phụ thuộc vào cách bạn xây dựng Adapater.

2. Đặt vấn đề với ListView, khi nào phải sử dụng ListView trong Android?

Thường chúng ta sẽ gặp phải 1 số yêu cầu như: hiển thị danh sách danh bạ, số điện thoại, danh sách công việc, danh sách bạn bè facebook.v.v.v. Yep. Hôm nay chúng ta sẽ cùng nhau tìm hiểu về ListView với yêu cầu xây dựng màn hình hiển thị một danh sách bài hát.

3. Xây dựng Custom ListView trong Android.

a. Layout

activity_main.xml: Chứa thẻ ListView trong đó ngoài các thuộc tính thẻ như width ,height, layout_align thì các bạn có thể thấy mình sử dụng thuộc tính animationCache=”false” tức là mình sẽ không lưu các animation vào cache để mang lại hiệu năng sử dụng tốt nhất.

item_song.xml: là phần layout sẽ hiển thị nội dung của từng đối tượng bài hát.

kenhlaptrinh-net_listview_item

b. Xây dựng phần xử lý ListView trong Android.

Lớp Song.java để khai báo các thuộc tính cho đối tượng Song.

Tiếp đến ta cần phải xây dựng apdapter cho ListView:

Nhiệm vụ của Adapter mình đã chia sẻ ở phía trên.

Nhưng chắc hẳn ai cũng có nhiều thắc mắc ở chỗ này. Tại sao lại extends từ BaseAdapter? Ngoài BaseAdapter ra còn class nào khác ta có thể extends không?

Giải đáp giống như cái tên của nó thì BaseAdapter là adapter cơ bản nhất nó hỗ trợ data bạn truyền vào nó là bất cứ thể loại nào: như ArrayList ,Cursor… Và khi ta extend nó sẽ hỗ trợ tất cả các phương thức để thao tác với dữ liệu như :

getView():hỗ trợ Tạo ra các viewItem và mapping trực tiếp data lên các viewItem.

getCount(): trả về số lượng các viewItem dựa vào số size() của mảng data.

getItem(int position): trả về Object dựa vào vị trí của đối tượng đó trong mảng dữ liệu.

getItemId(int position): trả về id trên View của từng item mà adapter tạo ra.

Ngoài BaseAdapter ta còn có thể extends từ các class như ArrayAdapter,ListAdapter cũng giống như BaseAdpter nhưng 2 class này thì ta chỉ sử dụng với mảng đối tượng là Array hoặc List và nó chỉ cung cấp phương thức getView().

Sự khác biệt về hiệu năng giữa các Adapter là không đáng kể. Điều quan trọng nhất ảnh hưởng trực tiếp đến hiệu suất của Adapter là phương thức getView().

Trong hàm getView() mình đã cho kiểm tra đối tượng convertView nếu nó bằng null thì mới khởi tạo đối tượng cho nó với LayoutInflater. nó bằng null khi position ==0 và khi position >0 nó sẽ không khởi tạo lại View nữa. Nếu ta không kiểm tra thì nó có thể gây ảnh hưởng đến bộ nhớ cache khi ta scroll listview sẽ gặp tình trạng lag giật.

Xử lý các sự kiện click trên các item ở trên mình đang sử dụng cách mà gọi hàm xử lý ngay trong adapter nó chạy hoàn toàn bình thường. ngoài ra bạn có thể set sự kiện trên từng TextView hoặc imageView trên màn hình đó bằng cách setOnclick trên từng View đó. Nhưng với cách này thì bạn khó có thể sử dụng lại adapter này cho các ListView từ các màn hình khác. Cách tốt nhất mình nên xây dựng 1 Interface mới để xử lý các sự kiện này.

Tạo mới Interface HandlerClick và sửa lại sự kiện trong Adapter.

Sửa class  Adapter_LsSong

Cuối cùng là lớp MainActivity.java

4. Thành quả Custom ListView trong android:

Lời kết: Bạn thấy không, với chỉ một vài thao tác chỉnh sửa là chúng ta đã có một ứng dụng hoàn toàn mới và phong cách hơn nhiều. Hy vọng sẽ gặp lại các bạn trong những loạt bài kế tiếp của chuyên mục lập trình Android do mình hướng dẫn.

(Tác giả: Ninh Luyến)

Bình luận

Loading...