Giới thiệu
Khác với ListView, RecyclerView.Adapter cung cấp nhiều phương thức cập nhật chi tiết hơn, cho phép animation mượt mà và hiệu suất tốt hơn.
Các phương thức cập nhật chính
| Phương thức | Dùng khi |
|---|---|
notifyItemInserted(position) | Thêm 1 item tại vị trí |
notifyItemRemoved(position) | Xóa 1 item tại vị trí |
notifyItemChanged(position) | Cập nhật dữ liệu 1 item |
notifyItemRangeInserted(start, count) | Thêm nhiều item liên tiếp |
notifyItemRangeRemoved(start, count) | Xóa nhiều item liên tiếp |
notifyItemRangeChanged(start, count) | Cập nhật nhiều item |
notifyDataSetChanged() | Thay đổi lớn, không biết vị trí cụ thể (KHÔNG có animation) |
Ví dụ hoàn chỉnh
Bước 1: Giao diện (res/layout/activity_main.xml)
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="https://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<android.support.v7.widget.RecyclerView
android:id="@+id/recycler_view"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:scrollbars="vertical" />
<Button
android:id="@+id/btnAdd"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Thêm Item" />
</LinearLayout>
Bước 2: Item layout (res/layout/list_row.xml)
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="https://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:padding="16dp">
<TextView
android:id="@+id/title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="18sp" />
</LinearLayout>
Bước 3: Adapter (src/CustomAdapter.java)
package com.example.myapplication;
import android.content.Context;
import android.support.annotation.NonNull;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import java.util.ArrayList;
import java.util.List;
public class CustomAdapter extends RecyclerView.Adapter<CustomAdapter.ViewHolder> {
private List<String> data = new ArrayList<>();
@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext())
.inflate(R.layout.list_row, parent, false);
return new ViewHolder(view);
}
@Override
public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
holder.title.setText(data.get(position));
}
@Override
public int getItemCount() {
return data.size();
}
// Phương thức helper để cập nhật dữ liệu an toàn
public void addItem(String item) {
data.add(item);
notifyItemInserted(data.size() - 1);
}
public void removeItem(int position) {
if (position >= 0 && position < data.size()) {
data.remove(position);
notifyItemRemoved(position);
}
}
public void updateItem(int position, String newValue) {
if (position >= 0 && position < data.size()) {
data.set(position, newValue);
notifyItemChanged(position);
}
}
static class ViewHolder extends RecyclerView.ViewHolder {
TextView title;
ViewHolder(View itemView) {
super(itemView);
title = itemView.findViewById(R.id.title);
}
}
}
Bước 4: MainActivity.java
package com.example.myapplication;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.view.View;
import android.widget.Button;
public class MainActivity extends AppCompatActivity {
RecyclerView recyclerView;
CustomAdapter adapter;
Button btnAdd;
int counter = 0;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
recyclerView = findViewById(R.id.recycler_view);
recyclerView.setLayoutManager(new LinearLayoutManager(this));
adapter = new CustomAdapter();
recyclerView.setAdapter(adapter);
btnAdd = findViewById(R.id.btnAdd);
btnAdd.setOnClickListener(v -> {
adapter.addItem("Item mới " + (++counter));
});
// Ví dụ: Click item để xóa
// (Cần thêm OnClickListener trong ViewHolder hoặc dùng ItemTouchHelper)
}
}
Chạy ứng dụng
Nhấn Run. Danh sách ban đầu rỗng. Nhấn nút "Thêm Item" → item mới xuất hiện với animation mượt mà từ dưới lên.


Best Practices
- Luôn dùng
notifyItemXxx()thay vìnotifyDataSetChanged()khi biết vị trí thay đổi. - Sử dụng
DiffUtil(hoặcListAdapter) để tự động tính diff và cập nhật tối thiểu. - Không sửa đổi list trực tiếp từ ngoài Adapter - cung cấp phương thức public trong Adapter.
- Dùng
notifyItemChanged(position, payload)cho partial update (chỉ cập nhật một phần view).