Trong lập trình Android, Adapter là một lớp trung gian có vai trò kết nối giữa dữ liệugiao diện người dùng. Adapter lấy dữ liệu từ một nguồn dữ liệu (như mảng, danh sách, cơ sở dữ liệu, v.v.) và hiển thị chúng trên các thành phần giao diện người dùng như ListView, GridView, RecyclerView, v.v. Bằng cách sử dụng Adapter, bạn có thể làm cho dữ liệu động hiển thị trên các thành phần UI có cấu trúc danh sách hoặc lưới.

Adapter đóng vai trò như một “cầu nối” giữa View (giao diện người dùng) và Model (dữ liệu), giúp bạn hiển thị dữ liệu một cách hiệu quả và linh hoạt.

Vai trò của Adapter

Adapter có ba nhiệm vụ chính:

  1. Chuyển đổi dữ liệu: Lấy dữ liệu từ nguồn (có thể là mảng, danh sách, cơ sở dữ liệu, API…) và chuyển đổi nó thành các mục dữ liệu (items) có thể được hiển thị trong một danh sách hoặc lưới.
  2. Cung cấp các View: Adapter tạo ra các View (thành phần giao diện) tương ứng với từng mục dữ liệu, sau đó gán các giá trị dữ liệu vào các View này trước khi hiển thị chúng lên giao diện.
  3. Tái sử dụng View: Adapter giúp tối ưu hóa bộ nhớ và hiệu suất bằng cách tái sử dụng các View thông qua cơ chế View recycling. Điều này đặc biệt hữu ích khi làm việc với danh sách lớn.

Các loại Adapter trong Android

Android cung cấp một số loại Adapter phổ biến mà bạn có thể sử dụng tùy theo nhu cầu của mình. Dưới đây là các loại adapter thường gặp:

1. ArrayAdapter

ArrayAdapter là loại adapter cơ bản nhất, thường được sử dụng khi dữ liệu được lưu trữ dưới dạng một mảng hoặc danh sách đơn giản. Adapter này lấy dữ liệu từ mảng và gán chúng vào các TextView bên trong danh sách.

Khi nào sử dụng?

  • Khi bạn cần hiển thị một danh sách đơn giản với các mục là chuỗi văn bản (text).

Ví dụ:

// Dữ liệu là một mảng chuỗi
String[] fruits = {"Apple", "Banana", "Cherry", "Date"};

// Tạo ArrayAdapter và gán nó cho ListView
ArrayAdapter<String> adapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, fruits);

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

2. BaseAdapter

BaseAdapter là lớp cha của tất cả các adapter trong Android. Nó cung cấp các phương thức trừu tượng mà bạn cần phải ghi đè để định nghĩa cách adapter của bạn hoạt động. Bạn thường sử dụng BaseAdapter khi cần tạo adapter tùy chỉnh để hiển thị dữ liệu phức tạp hơn, chẳng hạn như một danh sách các đối tượng tùy chỉnh.

Khi nào sử dụng?

  • Khi dữ liệu không đơn giản hoặc bạn cần hiển thị nhiều thành phần UI cho mỗi mục danh sách (item).

Ví dụ:

public class CustomAdapter extends BaseAdapter {

    private Context context;
    private List<Item> itemList;

    public CustomAdapter(Context context, List<Item> itemList) {
        this.context = context;
        this.itemList = itemList;
    }

    @Override
    public int getCount() {
        return itemList.size();
    }

    @Override
    public Object getItem(int position) {
        return itemList.get(position);
    }

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

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        if (convertView == null) {
            LayoutInflater inflater = LayoutInflater.from(context);
            convertView = inflater.inflate(R.layout.list_item, parent, false);
        }

        // Lấy item hiện tại
        Item currentItem = itemList.get(position);

        // Thiết lập các giá trị cho view
        TextView textView = convertView.findViewById(R.id.textView);
        textView.setText(currentItem.getName());

        return convertView;
    }
}

3. RecyclerView.Adapter

RecyclerView.Adapter là adapter mạnh mẽ và linh hoạt nhất, được sử dụng với RecyclerView – một widget hiện đại thay thế cho ListViewGridView. RecyclerView.Adapter yêu cầu bạn cài đặt một lớp con và tùy chỉnh cách hiển thị và xử lý các mục dữ liệu.

Khi nào sử dụng?

  • Khi bạn cần hiển thị danh sách lớn với hiệu suất cao và cần tái sử dụng view, hoặc muốn có khả năng điều chỉnh phức tạp (chẳng hạn như animation, sự kiện swipe hoặc drag and drop).

Ví dụ:

public class MyRecyclerViewAdapter extends RecyclerView.Adapter<MyRecyclerViewAdapter.ViewHolder> {
    
    private List<String> data;
    
    public MyRecyclerViewAdapter(List<String> data) {
        this.data = data;
    }

    @NonNull
    @Override
    public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.recycler_item, parent, false);
        return new ViewHolder(view);
    }

    @Override
    public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
        holder.textView.setText(data.get(position));
    }

    @Override
    public int getItemCount() {
        return data.size();
    }

    public static class ViewHolder extends RecyclerView.ViewHolder {
        TextView textView;

        public ViewHolder(View itemView) {
            super(itemView);
            textView = itemView.findViewById(R.id.textView);
        }
    }
}

4. SimpleCursorAdapter

SimpleCursorAdapter được sử dụng khi dữ liệu của bạn nằm trong một Cursor, tức là khi bạn đang lấy dữ liệu từ một cơ sở dữ liệu SQL hoặc một nguồn dữ liệu khác sử dụng Cursor.

Khi nào sử dụng?

  • Khi bạn làm việc với cơ sở dữ liệu SQLite và cần hiển thị dữ liệu trực tiếp từ cơ sở dữ liệu vào giao diện người dùng.

Ví dụ:

Cursor cursor = database.query("my_table", null, null, null, null, null, null);
String[] fromColumns = {"column_name"};
int[] toViews = {R.id.textView};

// Tạo SimpleCursorAdapter
SimpleCursorAdapter adapter = new SimpleCursorAdapter(this, R.layout.list_item, cursor, fromColumns, toViews, 0);

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

Tóm tắt

Adapter là một phần quan trọng của Android trong việc kết nối dữ liệu với giao diện người dùng, giúp bạn hiển thị dữ liệu động dưới dạng danh sách, lưới hoặc các cấu trúc phức tạp hơn.

  • ArrayAdapter: Sử dụng khi dữ liệu đơn giản (danh sách hoặc mảng) và muốn hiển thị các mục dạng TextView.
  • BaseAdapter: Sử dụng khi bạn cần một adapter tùy chỉnh và có nhiều yêu cầu về giao diện.
  • RecyclerView.Adapter: Sử dụng với RecyclerView cho các danh sách lớn, hiệu suất cao, cần tái sử dụng và tùy chỉnh sâu hơn.
  • SimpleCursorAdapter: Sử dụng khi bạn làm việc với Cursor và dữ liệu từ cơ sở dữ liệu.

Việc lựa chọn đúng loại Adapter sẽ giúp ứng dụng của bạn chạy mượt mà, hiệu quả hơn, đồng thời tối ưu hóa hiệu suất khi hiển thị dữ liệu lớn.