Bài 10: Listview trong Android - Lập trình Android cơ bản

Đăng bởi: Admin | Lượt xem: 5972 | Chuyên mục: Android


1. Listview trong Android

ListView là một view group, hiển thị các thành phần (elements) theo một danh sách, có thể cuộn được theo chiều thẳng đứng. ListView là một view quan trọng, nó được sử dụng rộng rãi trong các ứng dụng Android. Một ví dụ đơn giản của ListView là danh bạ liên lạc của bạn, nơi bạn có một danh sách các địa chỉ liên lạc của bạn hiển thị trong một ListView.
Để tạo ListView hiển thị thông tin cần có 3 thành phần chính bao gồm :
  1. ListView
  2. ListItem
  3. Adapter
Ngoài ListView, Android cũng cung cấp cho bạn một view tương tự khác là RecycleView mà ở bài viết sau chúng ta sẽ tìm hiểu ở bài sau.

1.1 ListItem

Một ListView được tạo từ một danh sách các ListItem. ListItem là một dòng (row) riêng lẻ trong listview nơi mà dữ liệu sẽ được hiển thị. Bất kỳ dữ liệu nào trong listview chỉ được hiển thị thông qua listItem. Có thể coi listview như là một nhóm cuộn của các ListItem.

2. Adapter

2.1 Adapter là gì ?
Một Adapter là một đối tượng của một lớp cài đặt giao diện Adapter. Nó đóng vai trò như là một liên kết giữa một tập hợp dữ liệu và một Adapter View, một đối tượng của một lớp thừa kế lớp trừu tượng AdapterView. Tập hợp dữ liệu có thể là bất cứ điều gì mà trình bày dữ liệu một cách có cấu trúc. Mảng, các đối tượng List và các đối tượng Cursor thường sử dụng bộ dữ liệu.
Một Adapter có trách nhiệm lấy dữ liệu từ bộ dữ liệu và tạo ra các đối tượng View dựa trên dữ liệu đó. Các đối tượng View được tạo ra sau đó được sử dụng để gắn lên bất kỳ Adapter View mà ràng buộc với Adapter.
Hình ảnh dưới đây sẽ minh họa cho bạn biết về ý nghĩa của Adapter.

2.2 Adapter View làm việc như thế nào?

Adapter View có thể hiển thị các bộ dữ liệu lớn rất hiệu quả. Ví dụ, ListView và recyclerview có thể hiển thị hàng triệu phần tử mà không có bất cứ độ trễ đáng kể nào trong khi vẫn sử dụng bộ nhớ và CPU rất thấp. Chúng có thể làm điều đó như thế nào? Các Adapter View khác nhau tuân theo những chiến lược khác nhau. Tuy nhiên, đây là những gì mà hầu hết chúng thường làm.
  1. Chúng chỉ kết xuất những đối tượng View mà đã trên màn hình hoặc nó đang di chuyển vào màn hình. Bằng cách này, bộ nhớ tiêu thụ bởi một Adapter View có thể được cố định và độc lập với kích thước của tập dữ liệu.
  2. Chúng cũng cho phép các nhà phát triển giảm thiểu công sức cho các hoạt động inflate layout và tái sử dụng các đối tượng View sẵn có đã di chuyển khỏi màn. Điều này sẽ giúp tiêu thụ CPU thấp.

3. Thực hành tạo ListView hiển thị thông tin

Bước đầu tiên ta phải tạo 1 project demoListView.
Trong file activity_main.xml chúng ta tạo 1 đối tượng listview với id : list_view.
code XML :
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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"
    tools:context=".MainActivity">

    <ListView
        android:id="@+id/list_view"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>

</LinearLayout>
Tiếp theo ta tạo một file layout mới dùng để làm layoutitem.
code XML :
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical"
    android:padding="16dp">

    <TextView
         android:textSize="30dp"
        android:hint="name"
        android:id="@+id/tv_name"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"/>

</LinearLayout>
Trong hàm MainActivity.java chúng ta tạo một mảng danh sách tượng trưng cho data 
package com.vncoder.listview;

import androidx.appcompat.app.AppCompatActivity;

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

public class MainActivity extends AppCompatActivity {

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

        String[] items = {"item1", "item2", "item3"};
        
    }
}
Bây giờ tiến hành tạo Adapter để truyền liệu ra màn hình :
Bạn tạo một file java rồi cho nó extends từ BaseAdapter.
package com.vncoder.listview;

import android.app.Activity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.TextView;

public class Adapter extends BaseAdapter {
    private Activity activity;
    private String[] items;

    public Adapter(Activity activity, String[] items) {
        this.activity = activity;
        this.items = items;
    }

    @Override
    public int getCount() {
        return items.length;
    }

    @Override
    public Object getItem(int i) {
        return items[i];
    }

    @Override
    public long getItemId(int i) {
        return i;
    }

    @Override
    public View getView(int i, View view, ViewGroup viewGroup) {
        LayoutInflater inflater = activity.getLayoutInflater();
        view = inflater.inflate(R.layout.item, null);
        TextView tvName = (TextView) view.findViewById(R.id.tv_name);
        tvName.setText(items[i]);
        return view;
    }
}
Giải thích các hàm trong class Adapter.java
  1. Để có thể sử dụng Adapter thì chúng ta cần truyền cho class này dữ liệu dạng danh sách hoặc mảng (ở đây chúng ta dùng mảng, để ý cái String[] items ở bước trước), và truyền qua constructor của nó.
  2. Tiếp theo, ở hàm getCount(), hàm này sẽ trả về số lượng phần tử hiển thị trong danh sách. Con số này bắt buộc phải nhỏ hơn hoặc bằng số lượng phần tử trong mảng đầu vào, nếu không sẽ bị lỗi IndexOutOfBoundException.
  3. Hàm getView để nhận viewitem và hiển thị thông tin lên viewitem.
Kết quả :
Bài viết giới thiệu listview cũng như cách sử dụng listview để hiển thị một danh sách các String đơn giản,  ở bài sau chúng ta sẽ tìm hiểu RecycleView một phiên bản nâng cấp của ListView, một loại View chứa danh sách khác, họ hàng với ListView nhưng tốt hơn, dễ tùy biến hơn rất nhiều. Bên cạnh đó là cơ chế ViewHolder áp dụng được cho cả ListView và RecyclerView nhằm tăng tốc độ khi sử dụng danh sách.   
Bài tiếp theo: RecyclerView trong Android >>
vncoder logo

Theo dõi VnCoder trên Facebook, để cập nhật những bài viết, tin tức và khoá học mới nhất!