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ệu và giao 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:
- 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.
- 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.
- 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 ListView
và GridView
. 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.