recyclerViev
に問題があります。特にスクロールに問題があります。 私はいくつかのリストを持っています。これはリアルタイムで更新され、いくつかの項目が追加され、削除され、すべてがいくつかのパラメータによってソートされます。 リストの最初に最初にあったアイテムのパラメータを変更することができます。ソート後に別の位置に表示されます。RecyclerViewはDiffUtilを使用して、変更をスクロールしないようにします
私のrecyclerView
は、たとえば、最初の項目に焦点を当てており、変更後、ある項目が「より良い」パラメータでその最初の項目の位置を変更しているときです。
問題は、スクロールしていないときは「より良い」パラメータで新しい項目に集中したいが、タッチでスクロールしたときにはフォーカスしたくない(私のタッチはリストの現在の最初の項目にスクロールすることによって中断された)。
だから私は私のrecyclerView
データ内のすべての変更後に、このコードを強制したくない:私が言ったように私は私のrecyclerView
リストをタッチして行くのですとき、私はこのスクロールによって中断されますので、
recyclerView.scrollToPosition(0);
他のアイテムを見て、同時に私のリストに変更があります。
これを行う方法はありますか?
具体的には、私は私の現在のrecyclerViewリストに変更があったときのアニメーションをサポートするために、DiffUtilからDiffCallbackを使用しています - それは別の新しいリストで古いリストを比較して、すべての希望アニメーションを適用し、通知(アイテムの追加、削除、位置の変更)。だから私はここでその
である私のDiffUtilコールバックなどの
notifyDataSetChanged
か何かを呼び出すことはありません:
public static class DevicesDiffCallback extends DiffUtil.Callback{
List<DeviceInfo> oldDevices;
List<DeviceInfo> newDevices;
public DevicesDiffCallback(List<NexoDeviceInfo> newDevices, List<NexoDeviceInfo> oldDevices) {
this.newDevices = newDevices;
this.oldDevices = oldDevices;
}
@Override
public int getOldListSize() {
return oldDevices != null ? oldDevices.size() : 0;
}
@Override
public int getNewListSize() {
return newDevices != null ? newDevices.size() : 0;
}
@Override
public boolean areItemsTheSame(int oldItemPosition, int newItemPosition) {
return oldDevices.get(oldItemPosition).getNexoIdentifier().getSerialNumber().equals(newDevices.get(newItemPosition).getNexoIdentifier().getSerialNumber());
}
@Override
public boolean areContentsTheSame(int oldItemPosition, int newItemPosition) {
return oldDevices.get(oldItemPosition).equals(newDevices.get(newItemPosition));
}
@Override
public Object getChangePayload(int oldItemPosition, int newItemPosition) {
return super.getChangePayload(oldItemPosition, newItemPosition);
}
}
を、私は、新しいデータのリストを取得するとき私は、私のアダプタでこのようにそれを設定しますデータを取り込み、古いデータを置き換えてください:
public void setData(List<DeviceInfo> data) {
DiffUtil.DiffResult diffResult = DiffUtil.calculateDiff(new DevicesDiffCallback(this.mData, data), false);
diffResult.dispatchUpdatesTo(this);
mData = data;
}
新しいデータが来たときにリストの一番上にスクロールしたいのですが、ユーザーが手動でスクロールしているときにはスクロールしたくないのですか?正しく動作していない新しい項目にスクロールするコードを表示できますか? – elmorabea
私の質問が更新されました。私は実際に手動でスクロールすることで何もしません。それは新しいリストのコールバックとそのアイテムの最初のものが最初に "画面外"になったときに自動的に下にスクロールし、そのリサーチビューはその取り寄せにもスクロールします。私は一番下にスクロールするのではなく、リストの現在または新しい最初の位置に焦点を当てるだけですが、ユーザーがスクロールしているときには上にスクロールしません。 – Konrad
[その回答](https://stackoverflow.com/questions/43458146/diffutil-in-recycleview-making-it-autoscroll-if-a-new-item-is-added)をチェックしてください。 – elmorabea