title: RecyclerView using DiffUtil, prevent to scroll bottom on change
body: <p>I have a problem with my <code>recyclerViev</code>, specifically with the scrolling.
  I have some list, which is updated in real time, some item is added, some removed, and everything is sorted by some parameter. 
  So the item which was initially first on the list, can have its parameter changed, which will be in different position after the sorting.</p>
  
  <p>So my <code>recyclerView</code> is for example focusing on the initial item, and after change, when some item has "better" parameter is changing position with that initial item.</p>
  
  <p>Problem is, i want to focus on the new item, with "better" parameter when I'm not scrolling, but i don't want to focusing on it when i scroll by touch(so my touch will not be interrupted by scrolling to current first item on the list).</p>
  
  <p>So i don't want to force this code after every change in my <code>recyclerView</code> data:</p>
  
  <pre><code>recyclerView.scrollToPosition(0);
  </code></pre>
  
  <p>because as i said, i will be interrupted by this scroll when i am touching my <code>recyclerView</code> list and go down to see other items and in the same time there will be a change in my list.</p>
  
  <p>Is there a way to accomplish this?</p>
  
  <p>To be specific, i am using <strong>DiffCallback</strong> from the <strong>DiffUtil</strong>, to support animations when there is a change in my current recyclerView list - it compares the old list with another new list and apply all the wanted animations and notifications(item added, removed, changed position). So i never call </p>
  
  <pre><code>notifyDataSetChanged
  </code></pre>
  
  <p>or anything like that</p>
  
  <p>Here is my DiffUtil callback:</p>
  
  <pre><code>  public static class DevicesDiffCallback extends DiffUtil.Callback{
  
      List&lt;DeviceInfo&gt; oldDevices;
      List&lt;DeviceInfo&gt; newDevices;
  
      public DevicesDiffCallback(List&lt;NexoDeviceInfo&gt; newDevices, List&lt;NexoDeviceInfo&gt; 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);
      }
  }
  </code></pre>
  
  <p>And i set it like this in my adapter, when i get the list of new data to be populated and replace the old data:</p>
  
  <pre><code> public void setData(List&lt;DeviceInfo&gt; data) {
      DiffUtil.DiffResult diffResult = DiffUtil.calculateDiff(new DevicesDiffCallback(this.mData, data), false);
      diffResult.dispatchUpdatesTo(this);
  
          mData = data;
  
  }
  </code></pre>