Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> Android

Cách cập nhật dữ liệu RecyclerView Adapter trên Android

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ứcDù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.

Cách cập nhật dữ liệu RecyclerView Adapter trên Android

Cách cập nhật dữ liệu RecyclerView Adapter trên Android

Best Practices

  • Luôn dùng notifyItemXxx() thay vì notifyDataSetChanged() khi biết vị trí thay đổi.
  • Sử dụng DiffUtil (hoặc ListAdapter) để 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).