[Học Android] RecyclerView với nhiều kiểu item
![[Học Android] RecyclerView với nhiều kiểu item](https://webnulled.net/wp-content/uploads/2022/02/android-recyclerview-voi-nhieu-kieu-item_6202b4394d6aa.jpeg)
RecyclerView với nhiều kiểu item (RecyclerView with multiple view type)
Hầu hết chúng ta đã quen thuộc với RecycleView có một kiểu item, tức là mỗi dòng có giao diện giống nhau, chỉ khác về dữ liệu hiển thị. Trong bài viết này, chúng ta sẽ cùng tìm hiểu cách triển khai RecyclerView với nhiều kiểu item.
Ví dụ về Android RecyclerView với nhiều kiểu item.
Table of Contents
– Bước 1: Tạo 2 file layout cho 2 kiểu item
item_call.xml
item_email.xml
– Bước 2: Tạo model
Chúng ta sử dụng chung lớp Employee cho cả 2 item. Lớp Employee gồm 2 trường số điện thoại và email. Nếu để trống điện thoại, điều đó có nghĩa là giá trị cho email là bắt buộc và ngược lại nếu giữ email trống, điều đó có nghĩa là giá trị của điện thoại là bắt buộc. Vì vậy, nếu điện thoại trống thì RecyclerView hiển thị giao diện người dùng email và nếu email trống thì RecyclerView hiển thị giao diện người dùng cuộc gọi.
ArrayList employees = new ArrayList();
Employee employee = new Employee();
employee.setName("Robert");
employee.setAddress("New York");
employee.setPhone("+61234456");
employees.add(employee);
employee = new Employee();
employee.setName("Tom");
employee.setAddress("California");
employee.setEmail("[email protected]");
employees.add(employee);
employee = new Employee();
employee.setName("Smith");
employee.setAddress("Philadelphia");
employee.setEmail("[email protected]");
employees.add(employee);
employee = new Employee();
employee.setName("Ryan");
employee.setAddress("Canada");
employee.setPhone("+612001456");
employees.add(employee);
employee = new Employee();
employee.setName("Mark");
employee.setAddress("Boston");
employee.setEmail("[email protected]");
employees.add(employee);
employee = new Employee();
employee.setName("Adam");
employee.setAddress("Brooklyn");
employee.setPhone("+61211780");
employees.add(employee);
employee = new Employee();
employee.setName("Kevin");
employee.setAddress("New Jersey");
employee.setPhone("+94221035");
employees.add(employee);
// set adapter
EmployeeAdapter adapter = new EmployeeAdapter(this, employees);
recyclerView.setLayoutManager(new LinearLayoutManager(this));
recylerView.setAdapter(adapter);
– Bước 3: Tạo adapter
Với RecyclerView thông thường chúng ta sử dụng adapter extends RecyclerView.Adapter
– getItemViewType()
private static int TYPE_CALL = 1;
private static int TYPE_EMAIL = 2;
@Override
public int getItemViewType(int position) {
if (TextUtils.isEmpty(employees.get(position).getEmail())) {
return TYPE_CALL;
} else {
return TYPE_EMAIL;
}
}
– Tạo 2 view holder cho 2 item
class CallViewHolder extends RecyclerView.ViewHolder {
private TextView txtName;
private TextView txtAddress;
CallViewHolder(@NonNull View itemView) {
super(itemView);
txtName = itemView.findViewById(R.id.txtName);
txtAddress = itemView.findViewById(R.id.txtAddress);
}
}
class EmailViewHolder extends RecyclerView.ViewHolder {
private TextView txtName;
private TextView txtAddress;
EmailViewHolder(@NonNull View itemView) {
super(itemView);
txtName = itemView.findViewById(R.id.txtName);
txtAddress = itemView.findViewById(R.id.txtAddress);
}
}
– onCreateViewHolder
@NonNull
@Override
public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int viewType) {
View view;
if (viewType == TYPE_CALL) { // for call layout
view = LayoutInflater.from(context).inflate(R.layout.item_call, viewGroup, false);
return new CallViewHolder(view);
} else { // for email layout
view = LayoutInflater.from(context).inflate(R.layout.item_email, viewGroup, false);
return new EmailViewHolder(view);
}
}
– onBindViewHolder
@Override
public void onBindViewHolder(@NonNull RecyclerView.ViewHolder viewHolder, int position) {
if (getItemViewType(position) == TYPE_CALL) {
((CallViewHolder) viewHolder).setCallDetails(employees.get(position));
} else {
((EmailViewHolder) viewHolder).setEmailDetails(employees.get(position));
}
}
private void setCallDetails(Employee employee) {
txtName.setText(employee.getName());
txtAddress.setText(employee.getAddress());
}
private void setEmailDetails(Employee employee) {
txtName.setText(employee.getName());
txtAddress.setText(employee.getAddress());
}
Bạn cũng có thể thêm header hay footer trong RecyclerView bằng tính năng này. Trong ví dụ dưới đây, chỉ có 3 loại item: header, footer và item call trong một recyclerview duy nhất bằng cách sử dụng nhiều kiểu item.
Chào thân ái và quyết thắng!
Link bài viết gốc: https://medium.com/@droidbyme/android-recyclerview-with-multiple-view-type-multiple-view-holder-af798458763b