Commit 4602bd00 authored by Tiago Cunha's avatar Tiago Cunha

Using diff util to update the list

parent 47d10642
...@@ -145,6 +145,7 @@ public class RoomFragment extends AbstractChatRoomFragment ...@@ -145,6 +145,7 @@ public class RoomFragment extends AbstractChatRoomFragment
LinearLayoutManager layoutManager = new LinearLayoutManager(getContext(), LinearLayoutManager layoutManager = new LinearLayoutManager(getContext(),
LinearLayoutManager.VERTICAL, true); LinearLayoutManager.VERTICAL, true);
listView.setLayoutManager(layoutManager); listView.setLayoutManager(layoutManager);
adapter.setLayoutManager(layoutManager);
scrollListener = new LoadMoreScrollListener(layoutManager, 40) { scrollListener = new LoadMoreScrollListener(layoutManager, 40) {
@Override @Override
......
...@@ -2,6 +2,8 @@ package chat.rocket.android.layouthelper; ...@@ -2,6 +2,8 @@ package chat.rocket.android.layouthelper;
import android.content.Context; import android.content.Context;
import android.support.annotation.LayoutRes; import android.support.annotation.LayoutRes;
import android.support.v7.util.ListUpdateCallback;
import android.support.v7.widget.RecyclerView;
import io.realm.RealmObject; import io.realm.RealmObject;
import chat.rocket.android.realm_helper.RealmModelListAdapter; import chat.rocket.android.realm_helper.RealmModelListAdapter;
...@@ -16,6 +18,8 @@ public abstract class ExtRealmModelListAdapter<T extends RealmObject, VM, ...@@ -16,6 +18,8 @@ public abstract class ExtRealmModelListAdapter<T extends RealmObject, VM,
protected static final int VIEW_TYPE_HEADER = -1; protected static final int VIEW_TYPE_HEADER = -1;
protected static final int VIEW_TYPE_FOOTER = -2; protected static final int VIEW_TYPE_FOOTER = -2;
private RecyclerView.LayoutManager layoutManager;
protected ExtRealmModelListAdapter(Context context) { protected ExtRealmModelListAdapter(Context context) {
super(context); super(context);
} }
...@@ -37,6 +41,35 @@ public abstract class ExtRealmModelListAdapter<T extends RealmObject, VM, ...@@ -37,6 +41,35 @@ public abstract class ExtRealmModelListAdapter<T extends RealmObject, VM,
notifyItemChanged(position + 1); notifyItemChanged(position + 1);
} }
public void setLayoutManager(RecyclerView.LayoutManager layoutManager) {
this.layoutManager = layoutManager;
}
protected ListUpdateCallback listUpdateCallback = new ListUpdateCallback() {
@Override
public void onInserted(int position, int count) {
notifyItemRangeInserted(position + 1, count);
if (layoutManager != null) {
layoutManager.scrollToPosition(0);
}
}
@Override
public void onRemoved(int position, int count) {
notifyItemRangeRemoved(position + 1, count);
}
@Override
public void onMoved(int fromPosition, int toPosition) {
notifyItemMoved(fromPosition + 1, toPosition + 1);
}
@Override
public void onChanged(int position, int count, Object payload) {
notifyItemRangeChanged(position + 1, count, payload);
}
};
@Override @Override
public int getItemViewType(int position) { public int getItemViewType(int position) {
if (position == 0) { if (position == 0) {
...@@ -83,4 +116,9 @@ public abstract class ExtRealmModelListAdapter<T extends RealmObject, VM, ...@@ -83,4 +116,9 @@ public abstract class ExtRealmModelListAdapter<T extends RealmObject, VM,
// rely on VH.bind(). // rely on VH.bind().
super.onBindViewHolder(holder, position - 1); super.onBindViewHolder(holder, position - 1);
} }
@Override
public ListUpdateCallback getListUpdateCallback() {
return listUpdateCallback;
}
} }
package chat.rocket.android.layouthelper.chatroom; package chat.rocket.android.layouthelper.chatroom;
import android.content.Context; import android.content.Context;
import android.support.v7.util.DiffUtil;
import android.support.v7.widget.RecyclerView;
import android.view.View; import android.view.View;
import java.util.ArrayList; import java.util.ArrayList;
...@@ -111,4 +113,53 @@ public class MessageListAdapter ...@@ -111,4 +113,53 @@ public class MessageListAdapter
return extMessages; return extMessages;
} }
@Override
protected DiffUtil.Callback getDiffCallback(List<PairedMessage> oldData,
List<PairedMessage> newData) {
return new PairedMessageDiffCallback(oldData, newData);
}
private static class PairedMessageDiffCallback extends DiffUtil.Callback {
private final List<PairedMessage> oldList;
private final List<PairedMessage> newList;
public PairedMessageDiffCallback(List<PairedMessage> oldList, List<PairedMessage> newList) {
this.oldList = oldList;
this.newList = newList;
}
@Override
public int getOldListSize() {
if (oldList == null) {
return 0;
}
return oldList.size();
}
@Override
public int getNewListSize() {
if (newList == null) {
return 0;
}
return newList.size();
}
@Override
public boolean areItemsTheSame(int oldItemPosition, int newItemPosition) {
PairedMessage oldMessage = oldList.get(oldItemPosition);
PairedMessage newMessage = newList.get(newItemPosition);
return oldMessage.getId().equals(newMessage.getId());
}
@Override
public boolean areContentsTheSame(int oldItemPosition, int newItemPosition) {
PairedMessage oldMessage = oldList.get(oldItemPosition);
PairedMessage newMessage = newList.get(newItemPosition);
return oldMessage.toString().equals(newMessage.toString());
}
}
} }
...@@ -32,4 +32,16 @@ public class PairedMessage { ...@@ -32,4 +32,16 @@ public class PairedMessage {
&& nextSibling.getUser() != null && target.getUser() != null && nextSibling.getUser() != null && target.getUser() != null
&& nextSibling.getUser().getId().equals(target.getUser().getId()); && nextSibling.getUser().getId().equals(target.getUser().getId());
} }
public String getId() {
return target.getId();
}
@Override
public String toString() {
return "PairedMessage{" +
"target=" + target +
", nextSibling=" + nextSibling +
'}';
}
} }
...@@ -131,4 +131,20 @@ public class Message extends RealmObject { ...@@ -131,4 +131,20 @@ public class Message extends RealmObject {
public void setUrls(String urls) { public void setUrls(String urls) {
this.urls = urls; this.urls = urls;
} }
@Override
public String toString() {
return "Message{" +
"_id='" + _id + '\'' +
", t='" + t + '\'' +
", rid='" + rid + '\'' +
", syncstate=" + syncstate +
", ts=" + ts +
", msg='" + msg + '\'' +
", u=" + u +
", groupable=" + groupable +
", attachments='" + attachments + '\'' +
", urls='" + urls + '\'' +
'}';
}
} }
...@@ -79,4 +79,16 @@ public class User extends RealmObject { ...@@ -79,4 +79,16 @@ public class User extends RealmObject {
public Settings getSettings() { public Settings getSettings() {
return settings; return settings;
} }
@Override
public String toString() {
return "User{" +
"_id='" + _id + '\'' +
", username='" + username + '\'' +
", status='" + status + '\'' +
", utcOffset=" + utcOffset +
", emails=" + emails +
", settings=" + settings +
'}';
}
} }
...@@ -2,6 +2,8 @@ package chat.rocket.android.realm_helper; ...@@ -2,6 +2,8 @@ package chat.rocket.android.realm_helper;
import android.content.Context; import android.content.Context;
import android.support.annotation.LayoutRes; import android.support.annotation.LayoutRes;
import android.support.v7.util.DiffUtil;
import android.support.v7.util.ListUpdateCallback;
import android.support.v7.widget.RecyclerView; import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater; import android.view.LayoutInflater;
import android.view.View; import android.view.View;
...@@ -89,12 +91,20 @@ public abstract class RealmModelListAdapter<T extends RealmObject, VM, ...@@ -89,12 +91,20 @@ public abstract class RealmModelListAdapter<T extends RealmObject, VM,
adapterData = mapResultsToViewModel(newData); adapterData = mapResultsToViewModel(newData);
notifyDataSetChanged(); notifyDataSetChanged();
} else { } else {
// TODO: use DillUtils! final List<VM> newMappedData = mapResultsToViewModel(newData);
adapterData = mapResultsToViewModel(newData); final DiffUtil.Callback diffCallback = getDiffCallback(adapterData, newMappedData);
notifyDataSetChanged(); final DiffUtil.DiffResult diffResult = DiffUtil.calculateDiff(diffCallback);
adapterData = newMappedData;
diffResult.dispatchUpdatesTo(getListUpdateCallback());
} }
} }
protected abstract DiffUtil.Callback getDiffCallback(List<VM> oldData, List<VM> newData);
protected abstract ListUpdateCallback getListUpdateCallback();
public void setOnItemClickListener(OnItemClickListener<VM> onItemClickListener) { public void setOnItemClickListener(OnItemClickListener<VM> onItemClickListener) {
this.onItemClickListener = onItemClickListener; this.onItemClickListener = onItemClickListener;
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment