Tôi đang cố gắng hiển thị ba (ít nhất là trường hợp tôi có vấn đề với) các mục trong một RecyclerView
với một StaggeredGridLayoutManager
với hai cột. Mục đầu tiên được kéo dài trên hai hàng. Đây là cách nó trông giống như:RecyclerView StaggeredGridLayoutManager sắp xếp lại vấn đề
Bây giờ, tôi đang di chuyển các mục "Khoản 2" to top. Dưới đây là đoạn code tôi gọi, trong bộ chuyển đổi (đó là một mẫu tôi đã viết để chứng minh vấn đề tôi có trong một dự án phức tạp hơn):
private int findById(int id) {
for (int i = 0; i < items.size(); ++i) {
if (items.get(i).title.equals("Item " + id)) {
return i;
}
}
return -1;
}
// Moving the item "Item 2" with id = 2 and position = 0
public void moveItem(int id, int position) {
final int idx = findById(id);
final Item item = items.get(idx);
if (position != idx) {
items.remove(idx);
items.add(position, item);
notifyItemMoved(idx, position);
//notifyDataSetChanged();
}
}
Sau đó, mảng là tốt: [Item 2, Item 1, Item 3]
. Tuy nhiên, quan điểm là xa tốt:
Nếu tôi chạm vào RecyclerView
(đủ để kích hoạt tác dụng thanh cuộn nếu không có đủ các mục để di chuyển), khoản 2 di chuyển sang trái, nơi tôi dự kiến nhìn thấy nó ở nơi đầu tiên (với một hình ảnh động đẹp):
Như bạn có thể thấy trong các mã, tôi đã cố gắng để thay thế notifyItemMoved(idx, position)
bởi một cuộc gọi đến notifyDataSetChanged()
. Nó hoạt động, nhưng thay đổi không phải là hoạt hình.
Tôi đã viết một mẫu hoàn chỉnh để minh họa điều này và đặt nó trên GitHub. Đó là gần như tối thiểu (có các tùy chọn để di chuyển mục và chuyển đổi spanning của họ).
Tôi không thấy những gì tôi có thể làm sai. Đây có phải là lỗi với StaggeredGridLayoutManager
không? Tôi muốn tránh notifyDataSetChanged()
vì tôi muốn giữ sự nhất quán liên quan đến hoạt ảnh.
Chỉnh sửa: sau một số lần đào, không cần phải có mục toàn bộ để hiển thị sự cố. Tôi đã gỡ bỏ toàn bộ nhịp. Khi tôi cố gắng di chuyển Mục 2 đến vị trí 0, nó không di chuyển: Mục 1 đi sau nó và Mục 3 được di chuyển ở bên phải, vì vậy tôi có: ô trống, Mục 2, dòng mới, Mục 1, Mục 3. Tôi vẫn có bố cục chính xác sau khi cuộn.
Điều thú vị hơn là tôi không gặp sự cố với số GridLayoutManager
. Tôi cần một mục toàn bộ vì vậy nó không phải là một giải pháp, nhưng tôi đoán nó thực sự là một lỗi trong StaggeredGridLayoutManager
…
Tôi không biết đây có phải là lỗi hay không nhưng tôi cũng thấy điều này, mọi thứ dường như chỉ di chuyển khi bạn cuộn và 'khoảng cách chiến lược' được chọn – tyczj
@tyczj:' GAP_HANDLING_NONE' tránh các mục đang di chuyển, nhưng tôi vẫn nhận được một bố trí không chính xác. 'GAP_HANDLING_MOVE_ITEMS_BETWEEN_SPANS' có lẽ là mặc định, dù sao, tôi có cùng hành vi với nó hơn là không chỉ định bất cứ điều gì. –
Có, tôi biết tôi chỉ nói rằng sau khi bạn cuộn bộ điều hợp kiểm tra các khoảng trống và sau đó di chuyển mọi thứ đến đúng vị trí – tyczj