diff --git a/app/src/leanback/java/com/fongmi/android/tv/ui/activity/VodActivity.java b/app/src/leanback/java/com/fongmi/android/tv/ui/activity/VodActivity.java index e7a41996c..1a9f97018 100644 --- a/app/src/leanback/java/com/fongmi/android/tv/ui/activity/VodActivity.java +++ b/app/src/leanback/java/com/fongmi/android/tv/ui/activity/VodActivity.java @@ -32,6 +32,8 @@ public class VodActivity extends BaseActivity { private ActivityVodBinding mBinding; private TypePresenter mTypePresenter; + private ArrayObjectAdapter mAdapter; + private PageAdapter mPageAdapter; private Result mResult; private View mOldView; @@ -54,14 +56,13 @@ public class VodActivity extends BaseActivity { @Override protected void initView() { mResult = Result.fromJson(getResult()); - sortCategories(); setRecyclerView(); setPager(); + setTypes(); } @Override protected void initEvent() { - mTypePresenter.setOnClickListener((item) -> mBinding.pager.setCurrentItem(mResult.getTypes().indexOf(item))); mBinding.pager.addOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener() { @Override public void onPageSelected(int position) { @@ -78,25 +79,39 @@ public class VodActivity extends BaseActivity { mOldView.setActivated(true); } }); + mTypePresenter.setOnClickListener(item -> { + int index = mResult.getTypes().indexOf(item); + if (index != mBinding.pager.getCurrentItem()) mBinding.pager.setCurrentItem(index); + else item.setFilter(item.getFilter() == null ? null : !item.getFilter()); + if (item.getFilter() != null) updateFilter(item.getFilter()); + }); } - private void sortCategories() { + private void setRecyclerView() { + mBinding.recycler.setHorizontalSpacing(ResUtil.dp2px(16)); + mBinding.recycler.setRowHeight(ViewGroup.LayoutParams.WRAP_CONTENT); + mBinding.recycler.setAdapter(new ItemBridgeAdapter(mAdapter = new ArrayObjectAdapter(mTypePresenter = new TypePresenter()))); + } + + private void setPager() { + mBinding.pager.setAdapter(mPageAdapter = new PageAdapter(getSupportFragmentManager())); + } + + private void setTypes() { List newTypes = new ArrayList<>(); for (String cate : ApiConfig.get().getHome().getCategories()) for (Class type : mResult.getTypes()) if (cate.equals(type.getTypeName())) newTypes.add(type); if (newTypes.size() > 0) mResult.setTypes(newTypes); + for (Class type : mResult.getTypes()) if (mResult.getFilters().containsKey(type.getTypeId())) type.setFilter(false); + mAdapter.setItems(mResult.getTypes(), null); } - private void setRecyclerView() { - mBinding.recycler.setHorizontalSpacing(ResUtil.dp2px(16)); - mBinding.recycler.setRowHeight(ViewGroup.LayoutParams.WRAP_CONTENT); - ArrayObjectAdapter adapter = new ArrayObjectAdapter(mTypePresenter = new TypePresenter()); - adapter.addAll(0, mResult.getTypes()); - ItemBridgeAdapter bridgeAdapter = new ItemBridgeAdapter(adapter); - mBinding.recycler.setAdapter(bridgeAdapter); + private void updateFilter(boolean filter) { + mAdapter.notifyArrayItemRangeChanged(0, mAdapter.size()); + getVodFragment().toggleFilter(filter); } - private void setPager() { - mBinding.pager.setAdapter(new PageAdapter(getSupportFragmentManager())); + private VodFragment getVodFragment() { + return (VodFragment) mPageAdapter.instantiateItem(mBinding.pager, mBinding.pager.getCurrentItem()); } class PageAdapter extends FragmentStatePagerAdapter { diff --git a/app/src/leanback/java/com/fongmi/android/tv/ui/fragment/VodFragment.java b/app/src/leanback/java/com/fongmi/android/tv/ui/fragment/VodFragment.java index 95f796b2b..d366f93b0 100644 --- a/app/src/leanback/java/com/fongmi/android/tv/ui/fragment/VodFragment.java +++ b/app/src/leanback/java/com/fongmi/android/tv/ui/fragment/VodFragment.java @@ -73,7 +73,6 @@ public class VodFragment extends Fragment implements CustomScroller.Callback, Vo public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { setRecyclerView(); setViewModel(); - setFilter(); getVideo(); } @@ -95,16 +94,6 @@ public class VodFragment extends Fragment implements CustomScroller.Callback, Vo }); } - private void setFilter() { - for (Filter filter : mFilters) { - FilterPresenter presenter = new FilterPresenter(filter.getKey()); - ArrayObjectAdapter adapter = new ArrayObjectAdapter(presenter); - presenter.setOnClickListener((key, item) -> setClick(adapter, key, item)); - adapter.addAll(0, filter.getValue()); - mAdapter.add(new ListRow(adapter)); - } - } - private void setClick(ArrayObjectAdapter adapter, String key, Filter.Value item) { if (mExtend.get(key) != null && Objects.equals(mExtend.get(key), item.getV())) return; for (int i = 0; i < adapter.size(); i++) ((Filter.Value) adapter.get(i)).setActivated(item); @@ -135,6 +124,27 @@ public class VodFragment extends Fragment implements CustomScroller.Callback, Vo mAdapter.addAll(mAdapter.size(), rows); } + private void addFilter() { + List rows = new ArrayList<>(); + for (Filter filter : mFilters) { + FilterPresenter presenter = new FilterPresenter(filter.getKey()); + ArrayObjectAdapter adapter = new ArrayObjectAdapter(presenter); + presenter.setOnClickListener((key, item) -> setClick(adapter, key, item)); + adapter.addAll(0, filter.getValue()); + rows.add(new ListRow(adapter)); + } + mAdapter.addAll(0, rows); + } + + public void toggleFilter(boolean open) { + if (open) { + addFilter(); + mBinding.recycler.postDelayed(() -> mBinding.recycler.smoothScrollToPosition(0), 50); + } else { + mAdapter.removeItems(0, mFilters.size()); + } + } + @Override public void onItemClick(Vod item) { DetailActivity.start(getActivity(), item.getVodId()); diff --git a/app/src/leanback/java/com/fongmi/android/tv/ui/presenter/TypePresenter.java b/app/src/leanback/java/com/fongmi/android/tv/ui/presenter/TypePresenter.java index 5056ce4cd..2f99eb27e 100644 --- a/app/src/leanback/java/com/fongmi/android/tv/ui/presenter/TypePresenter.java +++ b/app/src/leanback/java/com/fongmi/android/tv/ui/presenter/TypePresenter.java @@ -6,8 +6,10 @@ import android.view.ViewGroup; import androidx.annotation.NonNull; import androidx.leanback.widget.Presenter; +import com.fongmi.android.tv.R; import com.fongmi.android.tv.bean.Class; import com.fongmi.android.tv.databinding.AdapterTypeBinding; +import com.fongmi.android.tv.utils.ResUtil; public class TypePresenter extends Presenter { @@ -31,6 +33,8 @@ public class TypePresenter extends Presenter { Class item = (Class) object; ViewHolder holder = (ViewHolder) viewHolder; holder.binding.text.setText(item.getTypeName()); + holder.binding.text.setCompoundDrawablePadding(ResUtil.dp2px(4)); + holder.binding.text.setCompoundDrawablesRelativeWithIntrinsicBounds(0, 0, item.getFilter() == null ? 0 : item.getFilter() ? R.drawable.ic_filter_off : R.drawable.ic_filter_on, 0); setOnClickListener(holder, view -> mListener.onItemClick(item)); } diff --git a/app/src/leanback/res/drawable/ic_filter_off.xml b/app/src/leanback/res/drawable/ic_filter_off.xml new file mode 100644 index 000000000..427c3333b --- /dev/null +++ b/app/src/leanback/res/drawable/ic_filter_off.xml @@ -0,0 +1,13 @@ + + + + diff --git a/app/src/leanback/res/drawable/ic_filter_on.xml b/app/src/leanback/res/drawable/ic_filter_on.xml new file mode 100644 index 000000000..73844f358 --- /dev/null +++ b/app/src/leanback/res/drawable/ic_filter_on.xml @@ -0,0 +1,10 @@ + + + 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 b91848b7b..6d333d928 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 @@ -17,6 +17,8 @@ public class Class { @SerializedName("type_name") private String typeName; + private Boolean filter; + public String getTypeId() { return typeId; } @@ -25,6 +27,14 @@ public class Class { return typeName; } + public void setFilter(Boolean filter) { + this.filter = filter; + } + + public Boolean getFilter() { + return filter; + } + @Override public boolean equals(Object obj) { if (this == obj) return true;