diff --git a/app/src/leanback/java/com/fongmi/android/tv/bean/Func.java b/app/src/leanback/java/com/fongmi/android/tv/bean/Func.java index 84725b053..9f4e6261a 100644 --- a/app/src/leanback/java/com/fongmi/android/tv/bean/Func.java +++ b/app/src/leanback/java/com/fongmi/android/tv/bean/Func.java @@ -70,7 +70,7 @@ public class Func implements Diffable { @Override public boolean isSameItem(Func other) { - return getResId() == other.getResId(); + return equals(other); } @Override diff --git a/app/src/leanback/java/com/fongmi/android/tv/ui/fragment/CollectFragment.java b/app/src/leanback/java/com/fongmi/android/tv/ui/fragment/CollectFragment.java index f71dd2bfc..1dde7a741 100644 --- a/app/src/leanback/java/com/fongmi/android/tv/ui/fragment/CollectFragment.java +++ b/app/src/leanback/java/com/fongmi/android/tv/ui/fragment/CollectFragment.java @@ -22,6 +22,7 @@ import com.fongmi.android.tv.databinding.FragmentTypeBinding; import com.fongmi.android.tv.model.SiteViewModel; import com.fongmi.android.tv.ui.activity.VideoActivity; import com.fongmi.android.tv.ui.activity.VodActivity; +import com.fongmi.android.tv.ui.adapter.BaseDiffCallback; import com.fongmi.android.tv.ui.base.BaseFragment; import com.fongmi.android.tv.ui.custom.CustomRowPresenter; import com.fongmi.android.tv.ui.custom.CustomScroller; @@ -108,7 +109,7 @@ public class CollectFragment extends BaseFragment implements CustomScroller.Call List rows = new ArrayList<>(); for (List part : Lists.partition(items, Product.getColumn())) { mLast = new ArrayObjectAdapter(new VodPresenter(this)); - mLast.setItems(part, null); + mLast.setItems(part, new BaseDiffCallback()); rows.add(new ListRow(mLast)); } mAdapter.addAll(mAdapter.size(), rows); diff --git a/app/src/leanback/java/com/fongmi/android/tv/ui/fragment/TypeFragment.java b/app/src/leanback/java/com/fongmi/android/tv/ui/fragment/TypeFragment.java index c7cb14ef7..43d8457c1 100644 --- a/app/src/leanback/java/com/fongmi/android/tv/ui/fragment/TypeFragment.java +++ b/app/src/leanback/java/com/fongmi/android/tv/ui/fragment/TypeFragment.java @@ -15,7 +15,6 @@ import androidx.leanback.widget.ListRow; import androidx.lifecycle.ViewModelProvider; import androidx.viewbinding.ViewBinding; -import com.fongmi.android.tv.App; import com.fongmi.android.tv.Product; import com.fongmi.android.tv.R; import com.fongmi.android.tv.api.config.VodConfig; @@ -29,6 +28,7 @@ import com.fongmi.android.tv.databinding.FragmentTypeBinding; import com.fongmi.android.tv.model.SiteViewModel; import com.fongmi.android.tv.ui.activity.CollectActivity; import com.fongmi.android.tv.ui.activity.VideoActivity; +import com.fongmi.android.tv.ui.adapter.BaseDiffCallback; import com.fongmi.android.tv.ui.base.BaseFragment; import com.fongmi.android.tv.ui.custom.CustomRowPresenter; import com.fongmi.android.tv.ui.custom.CustomScroller; @@ -129,15 +129,8 @@ public class TypeFragment extends BaseFragment implements CustomScroller.Callbac private void setViewModel() { mViewModel = new ViewModelProvider(this).get(SiteViewModel.class); + mViewModel.result.observe(getViewLifecycleOwner(), this::setAdapter); mViewModel.action.observe(getViewLifecycleOwner(), result -> Notify.show(result.getMsg())); - mViewModel.result.observe(getViewLifecycleOwner(), result -> { - boolean first = mScroller.first(); - int size = result.getList().size(); - mBinding.progressLayout.showContent(first, size); - if (size > 0) addVideo(result); - mScroller.endLoading(result); - checkMore(size); - }); } private void setFilters() { @@ -164,13 +157,23 @@ public class TypeFragment extends BaseFragment implements CustomScroller.Callbac private void getVideo(String typeId, String page) { boolean first = "1".equals(page); if (first) mLast = null; - if (first) showProgress(); int filterSize = filterVisible ? mFilters.size() : 0; boolean clear = first && mAdapter.size() > filterSize; + if (first && mAdapter.size() == filterSize) showProgress(); if (clear) mAdapter.removeItems(filterSize, mAdapter.size() - filterSize); mViewModel.categoryContent(getKey(), typeId, page, true, mExtends); } + private void setAdapter(Result result) { + boolean first = mScroller.first(); + boolean flag = mExtends.isEmpty(); + int size = result.getList().size(); + mBinding.progressLayout.showContent(first & flag, size); + if (size > 0) addVideo(result); + mScroller.endLoading(result); + checkMore(size); + } + private void addVideo(Result result) { Style style = result.getStyle(getStyle()); if (style.isList()) mAdapter.addAll(mAdapter.size(), result.getList()); @@ -197,7 +200,7 @@ public class TypeFragment extends BaseFragment implements CustomScroller.Callbac List rows = new ArrayList<>(); for (List part : Lists.partition(items, Product.getColumn(style))) { mLast = new ArrayObjectAdapter(new VodPresenter(this, style)); - mLast.setItems(part, null); + mLast.setItems(part, new BaseDiffCallback()); rows.add(new ListRow(mLast)); } mAdapter.addAll(mAdapter.size(), rows); @@ -218,7 +221,7 @@ public class TypeFragment extends BaseFragment implements CustomScroller.Callbac private void showFilter() { List rows = new ArrayList<>(); for (Filter filter : mFilters) rows.add(getRow(filter)); - App.post(() -> mBinding.recycler.scrollToPosition(0), 48); + mBinding.recycler.postDelayed(() -> mBinding.recycler.scrollToPosition(0), 48); mAdapter.addAll(0, rows); } diff --git a/app/src/main/java/com/fongmi/android/tv/bean/Class.java b/app/src/main/java/com/fongmi/android/tv/bean/Class.java index b934f2e35..548b9c5d5 100644 --- a/app/src/main/java/com/fongmi/android/tv/bean/Class.java +++ b/app/src/main/java/com/fongmi/android/tv/bean/Class.java @@ -7,6 +7,7 @@ import android.text.TextUtils; import androidx.annotation.Nullable; import com.fongmi.android.tv.App; +import com.fongmi.android.tv.impl.Diffable; import com.github.catvod.utils.Trans; import com.google.gson.annotations.SerializedName; @@ -20,7 +21,7 @@ import java.util.HashMap; import java.util.List; @Root(strict = false) -public class Class implements Parcelable { +public class Class implements Parcelable, Diffable { @Attribute(name = "id", required = false) @SerializedName(value = "type_id", alternate = "id") @@ -190,4 +191,14 @@ public class Class implements Parcelable { return new Class[size]; } }; + + @Override + public boolean isSameItem(Class other) { + return equals(other); + } + + @Override + public boolean isSameContent(Class other) { + return getTypeName().equals(other.getTypeName()) && getTypeFlag().equals(other.getTypeFlag()); + } } diff --git a/app/src/main/java/com/fongmi/android/tv/bean/Collect.java b/app/src/main/java/com/fongmi/android/tv/bean/Collect.java index b8db64d34..9e5a603dd 100644 --- a/app/src/main/java/com/fongmi/android/tv/bean/Collect.java +++ b/app/src/main/java/com/fongmi/android/tv/bean/Collect.java @@ -90,7 +90,7 @@ public class Collect implements Parcelable, Diffable { @Override public boolean isSameItem(Collect other) { - return getSite().equals(other.getSite()); + return equals(other); } @Override 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 220ef5cdd..a46d46fd7 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 @@ -167,7 +167,7 @@ public class Device implements Diffable { public boolean equals(@Nullable Object obj) { if (this == obj) return true; if (!(obj instanceof Device it)) return false; - return getUuid().equals(it.getUuid()) && getName().equals(it.getName()) && getType() == it.getType(); + return getUuid().equals(it.getUuid()); } @NonNull @@ -178,12 +178,12 @@ public class Device implements Diffable { @Override public boolean isSameItem(Device other) { - return getUuid().equals(other.getUuid()); + return equals(other); } @Override public boolean isSameContent(Device other) { - return equals(other); + return getName().equals(other.getName()) && getType() == other.getType(); } public static class Sorter implements Comparator { diff --git a/app/src/main/java/com/fongmi/android/tv/bean/Episode.java b/app/src/main/java/com/fongmi/android/tv/bean/Episode.java index d67ce4de7..850b3c926 100644 --- a/app/src/main/java/com/fongmi/android/tv/bean/Episode.java +++ b/app/src/main/java/com/fongmi/android/tv/bean/Episode.java @@ -6,11 +6,12 @@ import android.os.Parcelable; import androidx.annotation.Nullable; import com.fongmi.android.tv.App; +import com.fongmi.android.tv.impl.Diffable; import com.fongmi.android.tv.utils.Util; import com.github.catvod.utils.Trans; import com.google.gson.annotations.SerializedName; -public class Episode implements Parcelable { +public class Episode implements Parcelable, Diffable { @SerializedName("name") private String name; @@ -111,15 +112,11 @@ public class Episode implements Parcelable { return name.toLowerCase().contains(getName().toLowerCase()); } - public boolean equals(Episode episode) { - return rule1(episode.getName()); - } - @Override public boolean equals(@Nullable Object obj) { if (this == obj) return true; if (!(obj instanceof Episode it)) return false; - return getUrl().equals(it.getUrl()) && getName().equals(it.getName()) && getDesc().equals(it.getDesc()); + return getName().equals(it.getName()); } @Override @@ -157,4 +154,14 @@ public class Episode implements Parcelable { return new Episode[size]; } }; + + @Override + public boolean isSameItem(Episode other) { + return equals(other); + } + + @Override + public boolean isSameContent(Episode other) { + return getUrl().equals(other.getUrl()) && getDesc().equals(other.getDesc()); + } } \ No newline at end of file diff --git a/app/src/main/java/com/fongmi/android/tv/bean/Flag.java b/app/src/main/java/com/fongmi/android/tv/bean/Flag.java index 08ee16ca5..a77640e8e 100644 --- a/app/src/main/java/com/fongmi/android/tv/bean/Flag.java +++ b/app/src/main/java/com/fongmi/android/tv/bean/Flag.java @@ -8,6 +8,7 @@ import androidx.annotation.NonNull; import androidx.annotation.Nullable; import com.fongmi.android.tv.App; +import com.fongmi.android.tv.impl.Diffable; import com.fongmi.android.tv.utils.Util; import com.github.catvod.utils.Trans; import com.google.gson.annotations.SerializedName; @@ -20,7 +21,7 @@ import java.util.Arrays; import java.util.List; import java.util.Locale; -public class Flag implements Parcelable { +public class Flag implements Parcelable, Diffable { @Attribute(name = "flag", required = false) @SerializedName("flag") @@ -175,4 +176,14 @@ public class Flag implements Parcelable { return new Flag[size]; } }; + + @Override + public boolean isSameItem(Flag other) { + return equals(other); + } + + @Override + public boolean isSameContent(Flag other) { + return equals(other); + } } diff --git a/app/src/main/java/com/fongmi/android/tv/bean/History.java b/app/src/main/java/com/fongmi/android/tv/bean/History.java index 541911ec6..e7309f82f 100644 --- a/app/src/main/java/com/fongmi/android/tv/bean/History.java +++ b/app/src/main/java/com/fongmi/android/tv/bean/History.java @@ -360,7 +360,7 @@ public class History implements Diffable { public boolean equals(@Nullable Object obj) { if (this == obj) return true; if (!(obj instanceof History it)) return false; - return getKey().equals(it.getKey()) && getVodName().equals(it.getVodName()) && getVodPic().equals(it.getVodPic()) && getCreateTime() == it.getCreateTime(); + return getKey().equals(it.getKey()); } @NonNull @@ -371,11 +371,11 @@ public class History implements Diffable { @Override public boolean isSameItem(History other) { - return getKey().equals(other.getKey()); + return equals(other); } @Override public boolean isSameContent(History other) { - return equals(other); + return getVodName().equals(other.getVodName()) && getVodPic().equals(other.getVodPic()) && getCreateTime() == other.getCreateTime(); } } diff --git a/app/src/main/java/com/fongmi/android/tv/bean/Keep.java b/app/src/main/java/com/fongmi/android/tv/bean/Keep.java index 1ce42a36e..aaa5d1b36 100644 --- a/app/src/main/java/com/fongmi/android/tv/bean/Keep.java +++ b/app/src/main/java/com/fongmi/android/tv/bean/Keep.java @@ -175,16 +175,16 @@ public class Keep implements Diffable { public boolean equals(@Nullable Object obj) { if (this == obj) return true; if (!(obj instanceof Keep it)) return false; - return getKey().equals(it.getKey()) && getVodName().equals(it.getVodName()) && getVodPic().equals(it.getVodPic()) && getCreateTime() == it.getCreateTime(); + return getKey().equals(it.getKey()); } @Override public boolean isSameItem(Keep other) { - return getKey().equals(other.getKey()); + return equals(other); } @Override public boolean isSameContent(Keep other) { - return equals(other); + return getVodName().equals(other.getVodName()) && getVodPic().equals(other.getVodPic()) && getCreateTime() == other.getCreateTime(); } } diff --git a/app/src/main/java/com/fongmi/android/tv/bean/Parse.java b/app/src/main/java/com/fongmi/android/tv/bean/Parse.java index 89bdbcb01..d0848c0b8 100644 --- a/app/src/main/java/com/fongmi/android/tv/bean/Parse.java +++ b/app/src/main/java/com/fongmi/android/tv/bean/Parse.java @@ -7,6 +7,7 @@ import androidx.annotation.Nullable; import com.fongmi.android.tv.App; import com.fongmi.android.tv.R; +import com.fongmi.android.tv.impl.Diffable; import com.fongmi.android.tv.utils.ResUtil; import com.fongmi.android.tv.utils.UrlUtil; import com.github.catvod.utils.Json; @@ -19,7 +20,7 @@ import java.util.HashMap; import java.util.List; import java.util.Map; -public class Parse { +public class Parse implements Diffable { @SerializedName("name") private String name; @@ -138,6 +139,16 @@ public class Parse { return map; } + @Override + public boolean isSameItem(Parse other) { + return equals(other); + } + + @Override + public boolean isSameContent(Parse other) { + return equals(other); + } + public static class Ext { @SerializedName("flag") diff --git a/app/src/main/java/com/fongmi/android/tv/bean/Value.java b/app/src/main/java/com/fongmi/android/tv/bean/Value.java index a5cdf8ccd..94ceb157d 100644 --- a/app/src/main/java/com/fongmi/android/tv/bean/Value.java +++ b/app/src/main/java/com/fongmi/android/tv/bean/Value.java @@ -6,10 +6,11 @@ import android.text.TextUtils; import androidx.annotation.Nullable; +import com.fongmi.android.tv.impl.Diffable; import com.github.catvod.utils.Trans; import com.google.gson.annotations.SerializedName; -public class Value implements Parcelable { +public class Value implements Parcelable, Diffable { @SerializedName("n") private String n; @@ -96,4 +97,14 @@ public class Value implements Parcelable { return new Value[size]; } }; + + @Override + public boolean isSameItem(Value other) { + return equals(other); + } + + @Override + public boolean isSameContent(Value other) { + return equals(other); + } } diff --git a/app/src/main/java/com/fongmi/android/tv/bean/Vod.java b/app/src/main/java/com/fongmi/android/tv/bean/Vod.java index c261bd5b1..d5252c75b 100644 --- a/app/src/main/java/com/fongmi/android/tv/bean/Vod.java +++ b/app/src/main/java/com/fongmi/android/tv/bean/Vod.java @@ -306,7 +306,7 @@ public class Vod implements Parcelable, Diffable { public boolean equals(@Nullable Object obj) { if (this == obj) return true; if (!(obj instanceof Vod it)) return false; - return getVodId().equals(it.getVodId()) && getVodName().equals(it.getVodName()) && getVodPic().equals(it.getVodPic()) && getVodRemarks().equals(it.getVodRemarks()) && getSite().equals(it.getSite()); + return getVodId().equals(it.getVodId()); } @Override @@ -377,11 +377,11 @@ public class Vod implements Parcelable, Diffable { @Override public boolean isSameItem(Vod other) { - return getVodId().equals(other.getVodId()); + return equals(other); } @Override public boolean isSameContent(Vod other) { - return equals(other); + return getVodName().equals(other.getVodName()) && getVodPic().equals(other.getVodPic()) && getVodRemarks().equals(other.getVodRemarks()) && getSite().equals(other.getSite()); } }