diff --git a/app/src/main/java/com/fongmi/android/tv/bean/Device.java b/app/src/main/java/com/fongmi/android/tv/bean/Device.java index 7dd4c0e79..c25d27dd1 100644 --- a/app/src/main/java/com/fongmi/android/tv/bean/Device.java +++ b/app/src/main/java/com/fongmi/android/tv/bean/Device.java @@ -13,16 +13,16 @@ import com.fongmi.android.tv.App; import com.fongmi.android.tv.Product; import com.fongmi.android.tv.db.AppDatabase; import com.fongmi.android.tv.server.Server; +import com.fongmi.android.tv.ui.adapter.diff.Diffable; import com.fongmi.android.tv.utils.UrlUtil; import com.fongmi.android.tv.utils.Util; import com.google.gson.annotations.SerializedName; -import java.util.Collections; import java.util.Comparator; import java.util.List; @Entity(indices = @Index(value = {"uuid", "name"}, unique = true)) -public class Device { +public class Device implements Diffable { @PrimaryKey(autoGenerate = true) @SerializedName("id") @@ -176,11 +176,17 @@ public class Device { return App.gson().toJson(this); } - public static class Sorter implements Comparator { + @Override + public boolean isSameItem(Device other) { + return getUuid().equals(other.getUuid()); + } - public static void sort(List items) { - if (items.size() > 1) Collections.sort(items, new Sorter()); - } + @Override + public boolean isSameContent(Device other) { + return equals(other); + } + + public static class Sorter implements Comparator { @Override public int compare(Device o1, Device o2) { diff --git a/app/src/main/java/com/fongmi/android/tv/ui/adapter/BaseDiffAdapter.java b/app/src/main/java/com/fongmi/android/tv/ui/adapter/BaseDiffAdapter.java index f94ce7b75..dfb2d125c 100644 --- a/app/src/main/java/com/fongmi/android/tv/ui/adapter/BaseDiffAdapter.java +++ b/app/src/main/java/com/fongmi/android/tv/ui/adapter/BaseDiffAdapter.java @@ -28,8 +28,8 @@ public abstract class BaseDiffAdapter, VH extends Recycler return differ.getCurrentList(); } - public void setItems(List list) { - differ.submitList(list); + public void setItems(List items) { + differ.submitList(items); } public void addItem(T item) { @@ -44,6 +44,12 @@ public abstract class BaseDiffAdapter, VH extends Recycler setItems(current); } + public void sort(java.util.Comparator comparator) { + List current = new ArrayList<>(getItems()); + current.sort(comparator); + setItems(current); + } + public void remove(T item) { List current = new ArrayList<>(getItems()); if (current.remove(item)) setItems(current); diff --git a/app/src/mobile/java/com/fongmi/android/tv/ui/adapter/DeviceAdapter.java b/app/src/mobile/java/com/fongmi/android/tv/ui/adapter/DeviceAdapter.java index a45e6ef44..526918b5c 100644 --- a/app/src/mobile/java/com/fongmi/android/tv/ui/adapter/DeviceAdapter.java +++ b/app/src/mobile/java/com/fongmi/android/tv/ui/adapter/DeviceAdapter.java @@ -13,13 +13,11 @@ import com.fongmi.android.tv.databinding.AdapterDeviceBinding; import java.util.ArrayList; import java.util.List; -public class DeviceAdapter extends RecyclerView.Adapter { +public class DeviceAdapter extends BaseDiffAdapter { private final OnClickListener mListener; - private final List mItems; public DeviceAdapter(OnClickListener listener) { - this.mItems = new ArrayList<>(); this.mListener = listener; } @@ -30,37 +28,23 @@ public class DeviceAdapter extends RecyclerView.Adapter items) { - if (items == null) return; - mItems.removeAll(items); - mItems.addAll(items); - Device.Sorter.sort(mItems); - notifyDataSetChanged(); - } - - public void remove(Device item) { - if (item == null) return; - mItems.remove(item); - notifyDataSetChanged(); + @Override + public void addItems(List items) { + super.addItems(items); + sort(new Device.Sorter()); } + @Override public void clear() { - mItems.clear(); Device.delete(); - notifyDataSetChanged(); } public List getIps() { List ips = new ArrayList<>(); - for (Device item : mItems) if (item.isApp()) ips.add(item.getIp()); + for (Device item : getItems()) if (item.isApp()) ips.add(item.getIp()); return ips; } - @Override - public int getItemCount() { - return mItems.size(); - } - @NonNull @Override public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { @@ -69,7 +53,7 @@ public class DeviceAdapter extends RecyclerView.Adapter devices) { - if (!devices.isEmpty()) adapter.addAll(devices); + if (!devices.isEmpty()) adapter.addItems(devices); } @Override public void onDeviceAdded(@NonNull org.fourthline.cling.model.meta.Device device) { - adapter.addAll(DLNADevice.get().add(device)); + adapter.addItems(DLNADevice.get().add(device)); } @Override diff --git a/app/src/mobile/java/com/fongmi/android/tv/ui/dialog/SyncDialog.java b/app/src/mobile/java/com/fongmi/android/tv/ui/dialog/SyncDialog.java index 4c2e47caf..7cfa5dd3f 100644 --- a/app/src/mobile/java/com/fongmi/android/tv/ui/dialog/SyncDialog.java +++ b/app/src/mobile/java/com/fongmi/android/tv/ui/dialog/SyncDialog.java @@ -116,7 +116,7 @@ public class SyncDialog extends BaseDialog implements DeviceAdapter.OnClickListe } private void getDevice() { - adapter.addAll(Device.getAll()); + adapter.addItems(Device.getAll()); if (adapter.getItemCount() == 0) App.post(this::onRefresh, 1000); } @@ -153,7 +153,7 @@ public class SyncDialog extends BaseDialog implements DeviceAdapter.OnClickListe @Override public void onFind(List devices) { - if (!devices.isEmpty()) adapter.addAll(devices); + if (!devices.isEmpty()) adapter.addItems(devices); } @Override