2017-12-04 34 views
0

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; 

} 
+1

新しいデータが来たときにリストの一番上にスクロールしたいのですが、ユーザーが手動でスクロールしているときにはスクロールしたくないのですか?正しく動作していない新しい項目にスクロールするコードを表示できますか? – elmorabea

+0

私の質問が更新されました。私は実際に手動でスクロールすることで何もしません。それは新しいリストのコールバックとそのアイテムの最初のものが最初に "画面外"になったときに自動的に下にスクロールし、そのリサーチビューはその取り寄せにもスクロールします。私は一番下にスクロールするのではなく、リストの現在または新しい最初の位置に焦点を当てるだけですが、ユーザーがスクロールしているときには上にスクロールしません。 – Konrad

+0

[その回答](https://stackoverflow.com/questions/43458146/diffutil-in-recycleview-making-it-autoscroll-if-a-new-item-is-added)をチェックしてください。 – elmorabea

答えて

0

私はこの回答についてはわかりませんが、あなたのコードはo電話DiffUtilは適切ではありません。

関連する問題