From 31a3dedc8742c00d6557370ddf9ad2afab933a8c Mon Sep 17 00:00:00 2001 From: FongMi Date: Thu, 2 Feb 2023 17:40:57 +0800 Subject: [PATCH] [mobile] support categoryContent --- .../tv/ui/custom/dialog/SiteDialog.java | 1 + .../android/tv/ui/fragment/VodFragment.java | 22 +++++--- .../{ChildFragment.java => TypeFragment.java} | 50 +++++++++++-------- app/src/mobile/res/layout/fragment_site.xml | 6 +-- .../{fragment_child.xml => fragment_type.xml} | 0 app/src/mobile/res/layout/fragment_vod.xml | 1 - 6 files changed, 47 insertions(+), 33 deletions(-) rename app/src/mobile/java/com/fongmi/android/tv/ui/fragment/child/{ChildFragment.java => TypeFragment.java} (75%) rename app/src/mobile/res/layout/{fragment_child.xml => fragment_type.xml} (100%) diff --git a/app/src/mobile/java/com/fongmi/android/tv/ui/custom/dialog/SiteDialog.java b/app/src/mobile/java/com/fongmi/android/tv/ui/custom/dialog/SiteDialog.java index 6569b5ed6..094a521a4 100644 --- a/app/src/mobile/java/com/fongmi/android/tv/ui/custom/dialog/SiteDialog.java +++ b/app/src/mobile/java/com/fongmi/android/tv/ui/custom/dialog/SiteDialog.java @@ -54,6 +54,7 @@ public class SiteDialog implements SiteAdapter.OnClickListener { private void setRecyclerView() { binding.recycler.setAdapter(adapter); + binding.recycler.setItemAnimator(null); binding.recycler.setHasFixedSize(true); binding.recycler.addItemDecoration(new SpaceItemDecoration(1, 16)); binding.recycler.scrollToPosition(ApiConfig.getHomeIndex()); diff --git a/app/src/mobile/java/com/fongmi/android/tv/ui/fragment/VodFragment.java b/app/src/mobile/java/com/fongmi/android/tv/ui/fragment/VodFragment.java index fd425cd6a..70c51e0bd 100644 --- a/app/src/mobile/java/com/fongmi/android/tv/ui/fragment/VodFragment.java +++ b/app/src/mobile/java/com/fongmi/android/tv/ui/fragment/VodFragment.java @@ -25,8 +25,8 @@ import com.fongmi.android.tv.model.SiteViewModel; import com.fongmi.android.tv.ui.activity.BaseFragment; import com.fongmi.android.tv.ui.adapter.TypeAdapter; import com.fongmi.android.tv.ui.custom.dialog.SiteDialog; -import com.fongmi.android.tv.ui.fragment.child.ChildFragment; import com.fongmi.android.tv.ui.fragment.child.SiteFragment; +import com.fongmi.android.tv.ui.fragment.child.TypeFragment; import com.fongmi.android.tv.utils.ResUtil; import com.google.gson.Gson; @@ -43,6 +43,7 @@ public class VodFragment extends BaseFragment implements SiteCallback { private SiteViewModel mViewModel; private TypeAdapter mTypeAdapter; private PageAdapter mPageAdapter; + private boolean destroy; public static VodFragment newInstance() { return new VodFragment(); @@ -52,6 +53,14 @@ public class VodFragment extends BaseFragment implements SiteCallback { return ApiConfig.get().getHome(); } + public boolean isDestroy() { + return destroy; + } + + public void setDestroy(boolean destroy) { + this.destroy = destroy; + } + @Override protected ViewBinding getBinding(@NonNull LayoutInflater inflater, @Nullable ViewGroup container) { return mBinding = FragmentVodBinding.inflate(inflater, container, false); @@ -89,6 +98,7 @@ public class VodFragment extends BaseFragment implements SiteCallback { EventBus.getDefault().post(result); mPageAdapter.setResult(result); setAdapter(result); + setDestroy(false); }); } @@ -107,7 +117,7 @@ public class VodFragment extends BaseFragment implements SiteCallback { mBinding.pager.setCurrentItem(0); } - public void onTitle(View view) { + private void onTitle(View view) { SiteDialog.create(this).filter(true).show(); } @@ -123,12 +133,12 @@ public class VodFragment extends BaseFragment implements SiteCallback { } private void homeContent() { + setDestroy(true); mTypeAdapter.clear(); mPageAdapter.notifyDataSetChanged(); String home = getSite().getName(); mBinding.title.setText(home.isEmpty() ? ResUtil.getString(R.string.app_name) : home); - if (getSite().getKey().isEmpty()) return; - mViewModel.homeContent(); + if (!getSite().getKey().isEmpty()) mViewModel.homeContent(); } class PageAdapter extends FragmentStatePagerAdapter { @@ -149,7 +159,7 @@ public class VodFragment extends BaseFragment implements SiteCallback { Class type = mTypeAdapter.get(position); if (position == 0) return SiteFragment.newInstance(); String filter = new Gson().toJson(result.getFilters().get(type.getTypeId())); - return ChildFragment.newInstance(type.getTypeId(), filter, type.getTypeFlag().equals("1")); + return TypeFragment.newInstance(type.getTypeId(), filter, type.getTypeFlag().equals("1")); } @Override @@ -164,7 +174,7 @@ public class VodFragment extends BaseFragment implements SiteCallback { @Override public void destroyItem(@NonNull ViewGroup container, int position, @NonNull Object object) { - if (position != 0) super.destroyItem(container, position, object); + if (position != 0 && isDestroy()) super.destroyItem(container, position, object); } } } diff --git a/app/src/mobile/java/com/fongmi/android/tv/ui/fragment/child/ChildFragment.java b/app/src/mobile/java/com/fongmi/android/tv/ui/fragment/child/TypeFragment.java similarity index 75% rename from app/src/mobile/java/com/fongmi/android/tv/ui/fragment/child/ChildFragment.java rename to app/src/mobile/java/com/fongmi/android/tv/ui/fragment/child/TypeFragment.java index 63f97f865..2cf5c1eb6 100644 --- a/app/src/mobile/java/com/fongmi/android/tv/ui/fragment/child/ChildFragment.java +++ b/app/src/mobile/java/com/fongmi/android/tv/ui/fragment/child/TypeFragment.java @@ -10,9 +10,10 @@ import androidx.lifecycle.ViewModelProvider; import androidx.recyclerview.widget.GridLayoutManager; import androidx.viewbinding.ViewBinding; +import com.fongmi.android.tv.api.ApiConfig; import com.fongmi.android.tv.bean.Filter; import com.fongmi.android.tv.bean.Vod; -import com.fongmi.android.tv.databinding.FragmentChildBinding; +import com.fongmi.android.tv.databinding.FragmentTypeBinding; import com.fongmi.android.tv.model.SiteViewModel; import com.fongmi.android.tv.ui.activity.BaseFragment; import com.fongmi.android.tv.ui.adapter.VodAdapter; @@ -23,15 +24,26 @@ import java.util.ArrayList; import java.util.HashMap; import java.util.List; -public class ChildFragment extends BaseFragment implements CustomScroller.Callback, VodAdapter.OnClickListener { +public class TypeFragment extends BaseFragment implements CustomScroller.Callback, VodAdapter.OnClickListener { - private FragmentChildBinding mBinding; private HashMap mExtend; - private SiteViewModel mViewModel; + private FragmentTypeBinding mBinding; private CustomScroller mScroller; + private SiteViewModel mViewModel; private List mFilters; private List mTypeIds; private VodAdapter mAdapter; + private boolean mOpen; + + public static TypeFragment newInstance(String typeId, String filter, boolean folder) { + Bundle args = new Bundle(); + args.putString("typeId", typeId); + args.putString("filter", filter); + args.putBoolean("folder", folder); + TypeFragment fragment = new TypeFragment(); + fragment.setArguments(args); + return fragment; + } private String getTypeId() { return getArguments().getString("typeId"); @@ -45,19 +57,9 @@ public class ChildFragment extends BaseFragment implements CustomScroller.Callba return getArguments().getBoolean("folder"); } - public static ChildFragment newInstance(String typeId, String filter, boolean folder) { - Bundle args = new Bundle(); - args.putString("typeId", typeId); - args.putString("filter", filter); - args.putBoolean("folder", folder); - ChildFragment fragment = new ChildFragment(); - fragment.setArguments(args); - return fragment; - } - @Override protected ViewBinding getBinding(@NonNull LayoutInflater inflater, @Nullable ViewGroup container) { - return mBinding = FragmentChildBinding.inflate(inflater, container, false); + return mBinding = FragmentTypeBinding.inflate(inflater, container, false); } @Override @@ -82,8 +84,8 @@ public class ChildFragment extends BaseFragment implements CustomScroller.Callba private void setViewModel() { mViewModel = new ViewModelProvider(this).get(SiteViewModel.class); mViewModel.result.observe(getViewLifecycleOwner(), result -> { + mBinding.progressLayout.showContent(isFolder(), result.getList().size()); mScroller.endLoading(result.getList().isEmpty()); - mBinding.progressLayout.showContent(); mAdapter.addAll(result.getList()); checkPage(); }); @@ -96,16 +98,14 @@ public class ChildFragment extends BaseFragment implements CustomScroller.Callba private void checkPage() { if (mScroller.getPage() != 1 || mAdapter.getItemCount() >= 4 || isFolder()) return; - mScroller.addPage(); - getVideo(getTypeId(), "2"); + if (mScroller.addPage()) getVideo(getTypeId(), "2"); } private void getVideo(String typeId, String page) { if (isFolder()) mTypeIds.add(typeId); - if (isFolder()) mBinding.recycler.scrollToPosition(0); - boolean clear = page.equals("1") && mAdapter.getItemCount() > mFilters.size(); - //if (clear) mAdapter.removeItems(mFilters.size(), mAdapter.size() - mFilters.size()); - //mViewModel.categoryContent(typeId, page, true, mExtend); + if (isFolder() && !mOpen) mBinding.recycler.scrollToPosition(0); + if (page.equals("1")) mAdapter.clear(); + mViewModel.categoryContent(ApiConfig.get().getHome().getKey(), typeId, page, true, mExtend); } @Override @@ -124,4 +124,10 @@ public class ChildFragment extends BaseFragment implements CustomScroller.Callba public boolean onLongClick(Vod item) { return false; } + + @Override + public void setUserVisibleHint(boolean isVisibleToUser) { + super.setUserVisibleHint(isVisibleToUser); + if (mBinding != null && !isVisibleToUser) mBinding.recycler.scrollToPosition(0); + } } diff --git a/app/src/mobile/res/layout/fragment_site.xml b/app/src/mobile/res/layout/fragment_site.xml index 036699013..fb833707c 100644 --- a/app/src/mobile/res/layout/fragment_site.xml +++ b/app/src/mobile/res/layout/fragment_site.xml @@ -21,8 +21,7 @@ android:id="@+id/history" android:layout_width="match_parent" android:layout_height="wrap_content" - android:layout_marginTop="16dp" - android:nestedScrollingEnabled="false" /> + android:layout_marginTop="16dp" /> + android:layout_height="match_parent" /> diff --git a/app/src/mobile/res/layout/fragment_child.xml b/app/src/mobile/res/layout/fragment_type.xml similarity index 100% rename from app/src/mobile/res/layout/fragment_child.xml rename to app/src/mobile/res/layout/fragment_type.xml diff --git a/app/src/mobile/res/layout/fragment_vod.xml b/app/src/mobile/res/layout/fragment_vod.xml index 9fbe85e22..d8dfa98cd 100644 --- a/app/src/mobile/res/layout/fragment_vod.xml +++ b/app/src/mobile/res/layout/fragment_vod.xml @@ -35,7 +35,6 @@ android:paddingTop="8dp" android:paddingEnd="8dp" app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager" - app:layout_scrollFlags="scroll|enterAlways" tools:listitem="@layout/adapter_type" />