Android: ListView trong Android

Các khóa học qua video:
Python SQL Server PHP C# Lập trình C Java HTML5-CSS3-JavaScript
Học trên YouTube <76K/tháng. Đăng ký Hội viên
Viết nhanh hơn - Học tốt hơn
Giải phóng thời gian, khai phóng năng lực

ListView trong Android là một view dùng để nhóm một số item và hiển thị chúng trong danh sách theo chiều dọc có thể cuộn được. Các item của danh sách này được tự động chèn vào list bằng cách sử dụng một Adapter để kéo nội dung từ một nguồn như một mảng hoặc cơ sở dữ liệu.

Một Adapter thực sự là cầu nối giữa các thành phần UI và nguồn dữ liệu mà điền dữ liệu vào trong thành phần UI. Adapter giữ dữ liệu và gửi dữ liệu tới Adapter View, từ đó view có thể lấy dữ liệu từ Adapter View đó và hiển thị dữ liệu trên các view khác nhau ở dạng Spinner, ListView, GridView, …

ListView và GridView là các lớp con của AdapterView. Gắn kết chúng với một Adapter, thu nhận dữ liệu từ một nguồn ngoại vi và tạo một View để biểu diễn mỗi entry.

Android cung cấp một số lớp con hữu ích của lớp Adapter để thu lấy các kiểu dữ liệu khác nhau và xây dựng các view cho một AdapterView (ví dụ ListView hoặc GridView). Các Adapter phổ biến là ArrayAdapter, Base Adapter,  CursorAdapter,  SimpleCursorAdapter, SpinnerAdapter và WrapperListAdapter.

Các thuộc tính của ListView trong Android

Dưới đây là một số thuộc tính riêng cho ListView:

Attribute Miêu tả
android:id Đây là ID mà nhận diện duy nhất Layout
android:divider Đây là drawable hoặc color để vẽ giữa các item trong danh sách
android:dividerHeight Xác định chiều cao của divider. Nó có thể là px, dp, sp, in, hoặc mm
android:entries Xác định tham chiếu tới một array resource mà sẽ đưa đến ListView
android:footerDividersEnabled Khi được thiết lập là false, thì ListView sẽ không vẽ divider trước mỗi footer của view. Giá trị mặc định là true
android:headerDividersEnabled Khi được thiết lập là false, thì ListView sẽ không vẽ divider sau mỗi header của view. Giá trị mặc định là true

ArrayAdapter trong Android

Bạn có thể sử dụng Adapter này khi nguồn dữ liệu là một mảng. Theo mặc định, ArrayAdapter tạo một view cho mỗi item trong mảng bằng việc gọi toString() trên mỗi item và đặt nội dung vào trong một TextView. Giả sử bạn có một mảng các chuỗi và muốn hiển thị trong một ListView, bạn khởi tạo một ArrayAdapter mới sử dụng một Constructor để xác định Layout cho mỗi chuỗi và mảng chuỗi.

ArrayAdapter adapter = new ArrayAdapter<String>(this,R.layout.ListView,StringArray);

Trong Constructor này, các tham số là:

  • Tham số đầu tiên this là ngữ cảnh ứng dụng. Trong hầu hết trường hợp, bạn giữ nguyên là this.
  • Tham số thứ hai sẽ là Layout được định nghĩa trong file XML và có TextView cho mỗi chuỗi trong mảng.
  • Tham số cuối cùng là một mảng các chuỗi sẽ được đưa vào trong TextView.

Khi đã tạo ArrayAdapter, thì sau đó bạn chỉ cần gọi setAdapter() trên đối tượng ListView của bạn như sau:

ListView listView = findViewById(R.id.listview);
listView.setAdapter(adapter);

Bạn sẽ định nghĩa List View của bạn dưới thư mục res/layout trong một file XML. Với ví dụ của chúng ta là file activity_main.xml.

Ví dụ

Sau đây là ví dụ đưa bạn qua các bước đơn giản để minh họa cách tạo ứng dụng Android bằng cách sử dụng ListView.

Bước Miêu tả
1 Bạn sử dụng Android Studio IDE để tạo ứng dụng Android.
2 Sửa đổi nội dung mặc định của res/layout/activity_main.xml để bao gồm ListView với các thuộc tính
3 Không cần thay đổi file strings.xml
4 Tạo một file TextView có tên là res/layout/activity_listview.xml. File này sẽ có thiết lập để hiển thị tất cả item trong danh sách. Do đó, bạn có thể tùy chỉnh font, padding, color, .. với file này
6 Chạy ứng dụng để chạy Android Emulator và kiểm tra kết quả các thay đổi đã thực hiện trong ứng dụng

Sau đây là nội dung của file MainActivity.java:

package v1study.com.listview;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.widget.ArrayAdapter;
import android.widget.ListView;

public class MainActivity extends AppCompatActivity {
  String[] courseArray = {"HTML5", "CSS3", "JavaScript", "jQuery", "Bootstrap", "MySQLi", "PHP"};

  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    ArrayAdapter adapter = new ArrayAdapter<String>(this, R.layout.activity_listview, courseArray);

    ListView listView = (ListView) findViewById(R.id.course_list);
    listView.setAdapter(adapter);
  }
}

Sau đây là nội dung của file activity_main.xml:

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
  xmlns:android="http://schemas.android.com/apk/res/android"
  xmlns:app="http://schemas.android.com/apk/res-auto"
  xmlns:tools="http://schemas.android.com/tools"
  android:layout_width="match_parent"
  android:layout_height="match_parent">

  <ListView
    android:id="@+id/course_list"
    android:layout_width="match_parent"
    android:layout_height="0dp"
    android:layout_marginTop="8dp"
    app:layout_constraintBottom_toBottomOf="parent"
    app:layout_constraintTop_toTopOf="parent"/>

</androidx.constraintlayout.widget.ConstraintLayout>

Sau đây là nội dung của file activity_listview.xml:

<?xml version="1.0" encoding="utf-8"?>

<TextView
  xmlns:android="http://schemas.android.com/apk/res/android"
  android:id="@+id/label"
  android:layout_width="fill_parent"
  android:layout_height="fill_parent"
  android:background="#8ac007"
  android:padding="10dip"
  android:textSize="30sp"
  android:textStyle="bold"/>

Chạy ứng dụng ở trên:

List View trong Android

SimpleCursorAdapter trong Android

Bạn có thể sử dụng Adapter này khi nguồn dữ liệu của bạn là một Database Cursor (Con trỏ tới cơ sở dữ liệu). Khi sử dụng SimpleCursorAdapter, bạn phải xác định một Layout để sử dụng cho mỗi hàng trong Cursor và các cột nào trong Cursor nên được chèn vào trong View nào trong Layout.

Ví dụ, nếu bạn muốn tạo một danh sách tên, số điện thoại, bạn có thể thực hiện một truy vấn để trả về một Cursor chứa một hàng cho mỗi người và các cột cho các tên và số. Sau đó, bạn tạo một mảng chuỗi xác định các cột nào từ Cursor bạn muốn trong Layout cho mỗi kết quả và một mảng số nguyên xác định các view tương ứng mà mỗi cột nên được đặt.

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 SimpleCursorAdapter, truyền Layout để sử dụng cho mỗi kết quả, Cursor chứa các kết quả, và hai mảng là:

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 một view cho mỗi hàng trong Cursor bằng cách sử dụng Layout đã cung cấp bằng việc chèn mỗi item vào trong tương ứng: toViews tương ứng.

» Tiếp: GridView trong Android
« Trước: Frame Layout trong Android
Các khóa học qua video:
Python SQL Server PHP C# Lập trình C Java HTML5-CSS3-JavaScript
Học trên YouTube <76K/tháng. Đăng ký Hội viên
Viết nhanh hơn - Học tốt hơn
Giải phóng thời gian, khai phóng năng lực
Copied !!!