RecyclerView
に2つの列を持つStaggeredGridLayoutManager
の項目を3つ(少なくとも問題がある場合)表示しようとしています。最初の項目は2つの行にまたがっています。今、私は先頭に「アイテム2」の項目を移動していRecyclerView StaggeredGridLayoutManager並べ替えの問題
:ここでは、それがどのように見えるかです。ここでは、アダプタ(それは私が、より複雑なプロジェクトでは、私が持っている問題を示すために書いたサンプルです)で、私は呼んコードです:その後
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();
}
}
、配列は結構です:[Item 2, Item 1, Item 3]
が。しかし、ビューには、はるかに細かいからである:
私はRecyclerView
(スクロールするのに十分な項目がない場合はオーバースクロール効果を誘発するのに十分な)をタッチすると、私は予想左へ2項の移行(素敵なアニメーションで)最初の場所でそれを参照してください。
あなたは多分コードで見たように、私はnotifyDataSetChanged()
への呼び出しによってnotifyItemMoved(idx, position)
を交換しようとしました。それは動作しますが、変更はアニメ化されません。
これを実証し、GitHubに載せるための完全なサンプルを書きました。それはほとんど最小です(項目を移動し、スパニングを切り替えるオプションがあります)。
私は何が間違っているのか分かりません。これはStaggeredGridLayoutManager
のバグですか? notifyDataSetChanged()
を避けたいのですが、アニメーションに関して一貫性を保ちたいと思います。
編集:一部を掘った後、完全にスパンしたアイテムを表示する必要はありません。私はフルスパンを削除しました。アイテム2をポジション0に移動しようとするとは移動しません:アイテム1が後になり、アイテム3が右に移動します。空のセル、アイテム2、改行、アイテム1、私はまだスクロール後に正しいレイアウトを持っています。
さらに興味深いのは、GridLayoutManager
の問題がないことです。私は解決策ではありませんので、フルスパンのアイテムが必要ですが、実際にはバグだと思います。StaggeredGridLayoutManager
...
これはバグかどうかわかりませんが、これも見たことがあります。スクロールしてギャップストラテジーをチェックしたように見えます。 – tyczj
@tyczj: 'GAP_HANDLING_NONE'は動いているアイテムを避けますが、依然として誤った処分を受ける。 'GAP_HANDLING_MOVE_ITEMS_BETWEEN_SPANS'はおそらくデフォルトですが、とにかく何も指定しない場合と同じ動作をします。 –
はい私はちょうどあなたがスクロールした後にアダプターがギャップをチェックしてから、物事を正しい場所に移動すると言っていることを知っています。 – tyczj