diff --git a/app/src/main/java/com/example/sprout/refactor/adapter/DiffCallback.java b/app/src/main/java/com/example/sprout/refactor/adapter/DiffCallback.java new file mode 100644 index 0000000..aa637c3 --- /dev/null +++ b/app/src/main/java/com/example/sprout/refactor/adapter/DiffCallback.java @@ -0,0 +1,38 @@ +package com.example.sprout.refactor.adapter; + +import android.support.v7.util.DiffUtil; + +import java.util.List; + +/** + * DiffUtilのCallbackの基底クラス + * + * @param 差分を出すクラス + * @author matsumoto_k + */ +public abstract class DiffCallback extends DiffUtil.Callback { + final protected List oldList; + final protected List newList; + + public DiffCallback(List oldList, List newList) { + this.oldList = oldList; + this.newList = newList; + } + + @Override + public int getOldListSize() { + return oldList.size(); + } + + @Override + public int getNewListSize() { + return newList.size(); + } + + @Override + public boolean areItemsTheSame(int oldItemPosition, int newItemPosition) { + return oldList.get(oldItemPosition) == newList.get(newItemPosition); + } + + public abstract Object getChangePayload(int oldItemPosition, int newItemPosition); +} diff --git a/app/src/main/java/com/example/sprout/refactor/adapter/MemberDiffCallBack.java b/app/src/main/java/com/example/sprout/refactor/adapter/MemberDiffCallBack.java new file mode 100644 index 0000000..77b1c9d --- /dev/null +++ b/app/src/main/java/com/example/sprout/refactor/adapter/MemberDiffCallBack.java @@ -0,0 +1,26 @@ +package com.example.sprout.refactor.adapter; + +import com.example.sprout.refactor.model.entity.Member; + +import java.util.List; + +/** + * userIdからMemberの差分を出す + * + * @author matsumoto_k + */ +public class MemberDiffCallBack extends DiffCallback { + public MemberDiffCallBack(List oldList, List newList) { + super(oldList, newList); + } + + @Override + public boolean areContentsTheSame(int oldItemPosition, int newItemPosition) { + return oldList.get(oldItemPosition).getUserId() == newList.get(newItemPosition).getUserId(); + } + + @Override + public Object getChangePayload(int oldItemPosition, int newItemPosition) { + return null; + } +} diff --git a/app/src/main/java/com/example/sprout/refactor/adapter/RoomDiffCallBack.java b/app/src/main/java/com/example/sprout/refactor/adapter/RoomDiffCallBack.java new file mode 100644 index 0000000..47c8450 --- /dev/null +++ b/app/src/main/java/com/example/sprout/refactor/adapter/RoomDiffCallBack.java @@ -0,0 +1,27 @@ +package com.example.sprout.refactor.adapter; + +import com.example.sprout.refactor.model.entity.Room; + +import java.util.List; + +/** + * roomIdからRoomの差分を出す + * + * @author matsumoto_k + */ +public class RoomDiffCallBack extends DiffCallback { + + public RoomDiffCallBack(List oldList, List newList) { + super(oldList, newList); + } + + @Override + public boolean areContentsTheSame(int oldItemPosition, int newItemPosition) { + return oldList.get(oldItemPosition).getRoomId() == newList.get(newItemPosition).getRoomId(); + } + + @Override + public Object getChangePayload(int oldItemPosition, int newItemPosition) { + return null; + } +} diff --git a/app/src/main/java/com/example/sprout/refactor/adapter/RoomListAdapter.java b/app/src/main/java/com/example/sprout/refactor/adapter/RoomListAdapter.java index 0297ee7..9318aa0 100644 --- a/app/src/main/java/com/example/sprout/refactor/adapter/RoomListAdapter.java +++ b/app/src/main/java/com/example/sprout/refactor/adapter/RoomListAdapter.java @@ -2,6 +2,7 @@ import android.content.Context; import android.databinding.DataBindingUtil; +import android.support.v7.util.DiffUtil; import android.support.v7.widget.RecyclerView; import android.view.LayoutInflater; import android.view.ViewGroup; @@ -11,6 +12,7 @@ import com.example.sprout.refactor.model.entity.Room; import java.util.ArrayList; +import java.util.List; /** * ルーム一覧のアダプター @@ -48,9 +50,10 @@ } public void setDataAndRefresh(ArrayList items) { - this.items.clear(); - this.items.addAll(items); - notifyDataSetChanged(); + List oldItems = this.items; + DiffUtil.DiffResult diffResult = DiffUtil.calculateDiff(new RoomDiffCallBack(oldItems, items)); + this.items = items; + diffResult.dispatchUpdatesTo(this); } @Override diff --git a/app/src/main/java/com/example/sprout/refactor/adapter/RoomMainAdapter.java b/app/src/main/java/com/example/sprout/refactor/adapter/RoomMainAdapter.java index 3b26d7a..837a948 100644 --- a/app/src/main/java/com/example/sprout/refactor/adapter/RoomMainAdapter.java +++ b/app/src/main/java/com/example/sprout/refactor/adapter/RoomMainAdapter.java @@ -1,11 +1,8 @@ package com.example.sprout.refactor.adapter; -/** - * Created by matsumoto_k on 2017/11/29. - */ - import android.content.Context; import android.databinding.DataBindingUtil; +import android.support.v7.util.DiffUtil; import android.support.v7.widget.RecyclerView; import android.view.LayoutInflater; import android.view.ViewGroup; @@ -15,6 +12,7 @@ import com.example.sprout.refactor.model.entity.Member; import java.util.ArrayList; +import java.util.List; /** * ルームのアダプター @@ -48,9 +46,10 @@ } public void setDataAndRefresh(ArrayList items) { - this.items.clear(); - this.items.addAll(items); - notifyDataSetChanged(); + List oldItems = this.items; + DiffUtil.DiffResult diffResult = DiffUtil.calculateDiff(new MemberDiffCallBack(oldItems, items)); + this.items = items; + diffResult.dispatchUpdatesTo(this); } @Override