diff --git a/app/src/leanback/java/com/fongmi/android/tv/ui/base/ViewType.java b/app/src/leanback/java/com/fongmi/android/tv/ui/base/ViewType.java new file mode 100644 index 000000000..025f260ef --- /dev/null +++ b/app/src/leanback/java/com/fongmi/android/tv/ui/base/ViewType.java @@ -0,0 +1,7 @@ +package com.fongmi.android.tv.ui.base; + +public class ViewType { + + public static final int GRID = 0; + public static final int FOLDER = 1; +} 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 931acd517..ea213e07c 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 @@ -26,6 +26,7 @@ import com.fongmi.android.tv.model.SiteViewModel; import com.fongmi.android.tv.ui.activity.CollectActivity; import com.fongmi.android.tv.ui.activity.DetailActivity; import com.fongmi.android.tv.ui.base.BaseFragment; +import com.fongmi.android.tv.ui.base.ViewType; import com.fongmi.android.tv.ui.custom.CustomRowPresenter; import com.fongmi.android.tv.ui.custom.CustomScroller; import com.fongmi.android.tv.ui.custom.CustomSelector; @@ -42,9 +43,9 @@ public class VodFragment extends BaseFragment implements CustomScroller.Callback private HashMap mExtends; private FragmentVodBinding mBinding; - private CustomScroller mScroller; private ArrayObjectAdapter mAdapter; private ArrayObjectAdapter mLast; + private CustomScroller mScroller; private SiteViewModel mViewModel; private List mFilters; private List mTypeIds; @@ -99,6 +100,7 @@ public class VodFragment extends BaseFragment implements CustomScroller.Callback @SuppressLint("RestrictedApi") private void setRecyclerView() { CustomSelector selector = new CustomSelector(); + selector.addPresenter(Vod.class, new VodPresenter(this, ViewType.FOLDER)); selector.addPresenter(ListRow.class, new CustomRowPresenter(16), VodPresenter.class); selector.addPresenter(ListRow.class, new CustomRowPresenter(8, FocusHighlight.ZOOM_FACTOR_NONE, HorizontalGridView.FOCUS_SCROLL_ALIGNED), FilterPresenter.class); mBinding.recycler.addOnScrollListener(mScroller = new CustomScroller(this)); @@ -147,17 +149,25 @@ public class VodFragment extends BaseFragment implements CustomScroller.Callback mViewModel.categoryContent(getKey(), typeId, page, true, mExtends); } + private void addVideo(List items) { + if (isFolder()) { + mAdapter.addAll(mAdapter.size(), items); + } else { + addGrid(items); + } + } + private boolean checkLastSize(List items) { if (mLast == null || items.size() == 0) return false; int size = Product.getColumn() - mLast.size(); if (size == 0) return false; size = Math.min(size, items.size()); mLast.addAll(mLast.size(), new ArrayList<>(items.subList(0, size))); - addVideo(new ArrayList<>(items.subList(size, items.size()))); + addGrid(new ArrayList<>(items.subList(size, items.size()))); return true; } - private void addVideo(List items) { + private void addGrid(List items) { if (checkLastSize(items)) return; List rows = new ArrayList<>(); for (List part : Lists.partition(items, Product.getColumn())) { diff --git a/app/src/leanback/java/com/fongmi/android/tv/ui/holder/VodFolderHolder.java b/app/src/leanback/java/com/fongmi/android/tv/ui/holder/VodFolderHolder.java new file mode 100644 index 000000000..8e2a3063c --- /dev/null +++ b/app/src/leanback/java/com/fongmi/android/tv/ui/holder/VodFolderHolder.java @@ -0,0 +1,32 @@ +package com.fongmi.android.tv.ui.holder; + +import android.widget.ImageView; + +import androidx.annotation.NonNull; +import androidx.leanback.widget.Presenter; + +import com.fongmi.android.tv.bean.Vod; +import com.fongmi.android.tv.databinding.AdapterVodFolderBinding; +import com.fongmi.android.tv.ui.presenter.VodPresenter; +import com.fongmi.android.tv.utils.ImgUtil; + +public class VodFolderHolder extends Presenter.ViewHolder { + + private final VodPresenter.OnClickListener listener; + public final AdapterVodFolderBinding binding; + + public VodFolderHolder(@NonNull AdapterVodFolderBinding binding, VodPresenter.OnClickListener listener) { + super(binding.getRoot()); + this.binding = binding; + this.listener = listener; + } + + public void initView(Vod item) { + binding.name.setText(item.getVodName()); + binding.remark.setText(item.getVodRemarks()); + binding.remark.setVisibility(item.getRemarkVisible()); + binding.getRoot().setOnClickListener(v -> listener.onItemClick(item)); + binding.getRoot().setOnLongClickListener(v -> listener.onLongClick(item)); + ImgUtil.load(item.getVodPic(), binding.image, ImageView.ScaleType.FIT_CENTER); + } +} diff --git a/app/src/leanback/java/com/fongmi/android/tv/ui/holder/VodGridHolder.java b/app/src/leanback/java/com/fongmi/android/tv/ui/holder/VodGridHolder.java new file mode 100644 index 000000000..ab3de4ca6 --- /dev/null +++ b/app/src/leanback/java/com/fongmi/android/tv/ui/holder/VodGridHolder.java @@ -0,0 +1,34 @@ +package com.fongmi.android.tv.ui.holder; + +import androidx.annotation.NonNull; +import androidx.leanback.widget.Presenter; + +import com.fongmi.android.tv.bean.Vod; +import com.fongmi.android.tv.databinding.AdapterVodGridBinding; +import com.fongmi.android.tv.ui.presenter.VodPresenter; +import com.fongmi.android.tv.utils.ImgUtil; + +public class VodGridHolder extends Presenter.ViewHolder { + + private final VodPresenter.OnClickListener listener; + public final AdapterVodGridBinding binding; + + public VodGridHolder(@NonNull AdapterVodGridBinding binding, VodPresenter.OnClickListener listener) { + super(binding.getRoot()); + this.binding = binding; + this.listener = listener; + } + + public void initView(Vod item) { + binding.name.setText(item.getVodName()); + binding.year.setText(item.getVodYear()); + binding.site.setText(item.getSiteName()); + binding.remark.setText(item.getVodRemarks()); + binding.site.setVisibility(item.getSiteVisible()); + binding.year.setVisibility(item.getYearVisible()); + binding.remark.setVisibility(item.getRemarkVisible()); + binding.getRoot().setOnClickListener(v -> listener.onItemClick(item)); + binding.getRoot().setOnLongClickListener(v -> listener.onLongClick(item)); + ImgUtil.load(item.getVodPic(), binding.image); + } +} diff --git a/app/src/leanback/java/com/fongmi/android/tv/ui/presenter/VodPresenter.java b/app/src/leanback/java/com/fongmi/android/tv/ui/presenter/VodPresenter.java index 0bcac2fa7..c6ffc3400 100644 --- a/app/src/leanback/java/com/fongmi/android/tv/ui/presenter/VodPresenter.java +++ b/app/src/leanback/java/com/fongmi/android/tv/ui/presenter/VodPresenter.java @@ -3,22 +3,30 @@ package com.fongmi.android.tv.ui.presenter; import android.view.LayoutInflater; import android.view.ViewGroup; -import androidx.annotation.NonNull; import androidx.leanback.widget.Presenter; import com.fongmi.android.tv.Product; import com.fongmi.android.tv.bean.Vod; -import com.fongmi.android.tv.databinding.AdapterVodBinding; -import com.fongmi.android.tv.utils.ImgUtil; +import com.fongmi.android.tv.databinding.AdapterVodFolderBinding; +import com.fongmi.android.tv.databinding.AdapterVodGridBinding; +import com.fongmi.android.tv.ui.base.ViewType; +import com.fongmi.android.tv.ui.holder.VodFolderHolder; +import com.fongmi.android.tv.ui.holder.VodGridHolder; import com.fongmi.android.tv.utils.ResUtil; public class VodPresenter extends Presenter { private final OnClickListener mListener; + private final int viewType; private int width, height; public VodPresenter(OnClickListener listener) { + this(listener, ViewType.GRID); + } + + public VodPresenter(OnClickListener listener, int viewType) { this.mListener = listener; + this.viewType = viewType; setLayoutSize(); } @@ -38,7 +46,8 @@ public class VodPresenter extends Presenter { @Override public Presenter.ViewHolder onCreateViewHolder(ViewGroup parent) { - ViewHolder holder = new ViewHolder(AdapterVodBinding.inflate(LayoutInflater.from(parent.getContext()), parent, false)); + if (viewType == ViewType.FOLDER) return new VodFolderHolder(AdapterVodFolderBinding.inflate(LayoutInflater.from(parent.getContext()), parent, false), mListener); + VodGridHolder holder = new VodGridHolder(AdapterVodGridBinding.inflate(LayoutInflater.from(parent.getContext()), parent, false), mListener); holder.binding.getRoot().getLayoutParams().width = width; holder.binding.getRoot().getLayoutParams().height = height; return holder; @@ -46,31 +55,17 @@ public class VodPresenter extends Presenter { @Override public void onBindViewHolder(Presenter.ViewHolder viewHolder, Object object) { - Vod item = (Vod) object; - ViewHolder holder = (ViewHolder) viewHolder; - holder.binding.name.setText(item.getVodName()); - holder.binding.year.setText(item.getVodYear()); - holder.binding.site.setText(item.getSiteName()); - holder.binding.remark.setText(item.getVodRemarks()); - holder.binding.site.setVisibility(item.getSiteVisible()); - holder.binding.year.setVisibility(item.getYearVisible()); - holder.binding.remark.setVisibility(item.getRemarkVisible()); - setOnClickListener(holder, view -> mListener.onItemClick(item)); - holder.view.setOnLongClickListener(v -> mListener.onLongClick(item)); - ImgUtil.load(item.getVodPic(), holder.binding.image); + switch (viewType) { + case ViewType.GRID: + ((VodGridHolder) viewHolder).initView((Vod) object); + break; + case ViewType.FOLDER: + ((VodFolderHolder) viewHolder).initView((Vod) object); + break; + } } @Override public void onUnbindViewHolder(Presenter.ViewHolder viewHolder) { } - - public static class ViewHolder extends Presenter.ViewHolder { - - private final AdapterVodBinding binding; - - public ViewHolder(@NonNull AdapterVodBinding binding) { - super(binding.getRoot()); - this.binding = binding; - } - } } \ No newline at end of file diff --git a/app/src/leanback/res/drawable/shape_vod_list.xml b/app/src/leanback/res/drawable/shape_vod_list.xml new file mode 100644 index 000000000..d0324ba55 --- /dev/null +++ b/app/src/leanback/res/drawable/shape_vod_list.xml @@ -0,0 +1,9 @@ + + + + + + + + \ No newline at end of file diff --git a/app/src/leanback/res/layout/adapter_vod_folder.xml b/app/src/leanback/res/layout/adapter_vod_folder.xml new file mode 100644 index 000000000..162ae4200 --- /dev/null +++ b/app/src/leanback/res/layout/adapter_vod_folder.xml @@ -0,0 +1,55 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/leanback/res/layout/adapter_vod_grid.xml b/app/src/leanback/res/layout/adapter_vod_grid.xml new file mode 100644 index 000000000..9ddf445c2 --- /dev/null +++ b/app/src/leanback/res/layout/adapter_vod_grid.xml @@ -0,0 +1,82 @@ + + + + + + + + + + + + + + + + \ No newline at end of file