Nếu bạn có id ổn định trong bộ chuyển đổi, bạn có thể có được kết quả khá tốt (hình ảnh động) nếu bạn tạo một mảng mới có chứa các mục lọc và gọi
recyclerView.swapAdapter(newAdapter, false);
Sử dụng swapAdapter gợi ý RecyclerView rằng nó có thể tái sử dụng chủ sở hữu xem. (vs trong setAdapter, nó phải tái chế tất cả các khung nhìn và tạo lại vì nó không biết rằng bộ điều hợp mới có cùng một ViewHolder được thiết lập với bộ điều hợp cũ).
Cách tiếp cận tốt hơn là tìm ra mục nào bị xóa và gọi notifyItemRemoved(index)
. Đừng quên để thực sự loại bỏ các mục. Điều này sẽ cho phép RecyclerView chạy các hình ảnh động tiên đoán. Giả sử bạn có một Adaptor rằng trong nội bộ sử dụng một ArrayList, thực hiện sẽ trông như thế này:
// adapter code
final List<ItemData> mItems = new ArrayList(); //contains your items
public void filterOut(String filter) {
final int size = mItems.size();
for(int i = size - 1; i>= 0; i--) {
if (mItems.get(i).test(filter) == false) {
mItems.remove(i);
notifyItemRemoved(i);
}
}
}
Nó sẽ thực hiện tốt hơn nếu bạn có thể hàng loạt notifyItemRemoved
cuộc gọi và sử dụng notifyItemRangeRemoved
để thay thế. Nó sẽ trông sth như: (không kiểm tra)
public void filterOut(String filter) {
final int size = mItems.size();
int batchCount = 0; // continuous # of items that are being removed
for(int i = size - 1; i>= 0; i--) {
if (mItems.get(i).test(filter) == false) {
mItems.remove(i);
batchCount ++;
} else if (batchCount != 0) { // dispatch batch
notifyItemRangeRemoved(i + 1, batchCount);
batchCount = 0;
}
}
// notify for remaining
if (batchCount != 0) { // dispatch remaining
notifyItemRangeRemoved(0, batchCount);
}
}
Bạn cần phải mở rộng đoạn mã này để thêm các mục mà trước đây được lọc ra nhưng bây giờ sẽ được hiển thị (ví dụ người dùng xóa các truy vấn lọc) nhưng tôi nghĩ cái này nên đưa ra ý tưởng cơ bản.
Hãy nhớ rằng, mỗi cuộc gọi mục thông báo sẽ ảnh hưởng đến những cuộc gọi sau đó (đó là lý do tôi duyệt qua danh sách từ đầu để tránh nó). Traversing từ kết thúc cũng giúp ArrayList loại bỏ hiệu suất phương pháp (ít mục để thay đổi). Ví dụ: nếu bạn đang duyệt qua danh sách từ đầu và xóa hai mục đầu tiên. Bạn nên hoặc gọi
notifyItemRangeRemoved(0, 2); // 2 items starting from index 0
hoặc nếu bạn gửi cho họ từng người một
notifyItemRemoved(0);
notifyItemRemoved(0);//because after the previous one is removed, this item is at position 0
Nếu bạn muốn cho một mảng bạn chỉ có thể tạo ra một mới 'ItemsAdapter' với nó và gọi' setAdapter' một lần nữa. –