[leanback] support folder type view

pull/123/head
FongMi 3 years ago
parent 9f1a20270c
commit e0baef51c9
  1. 7
      app/src/leanback/java/com/fongmi/android/tv/ui/base/ViewType.java
  2. 16
      app/src/leanback/java/com/fongmi/android/tv/ui/fragment/VodFragment.java
  3. 32
      app/src/leanback/java/com/fongmi/android/tv/ui/holder/VodFolderHolder.java
  4. 34
      app/src/leanback/java/com/fongmi/android/tv/ui/holder/VodGridHolder.java
  5. 47
      app/src/leanback/java/com/fongmi/android/tv/ui/presenter/VodPresenter.java
  6. 9
      app/src/leanback/res/drawable/shape_vod_list.xml
  7. 55
      app/src/leanback/res/layout/adapter_vod_folder.xml
  8. 82
      app/src/leanback/res/layout/adapter_vod_grid.xml

@ -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;
}

@ -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<String, String> mExtends;
private FragmentVodBinding mBinding;
private CustomScroller mScroller;
private ArrayObjectAdapter mAdapter;
private ArrayObjectAdapter mLast;
private CustomScroller mScroller;
private SiteViewModel mViewModel;
private List<Filter> mFilters;
private List<String> 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<Vod> items) {
if (isFolder()) {
mAdapter.addAll(mAdapter.size(), items);
} else {
addGrid(items);
}
}
private boolean checkLastSize(List<Vod> 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<Vod> items) {
private void addGrid(List<Vod> items) {
if (checkLastSize(items)) return;
List<ListRow> rows = new ArrayList<>();
for (List<Vod> part : Lists.partition(items, Product.getColumn())) {

@ -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);
}
}

@ -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);
}
}

@ -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;
}
}
}

@ -0,0 +1,9 @@
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<corners android:radius="8dp" />
<solid android:color="@color/black_20" />
</shape>

@ -0,0 +1,55 @@
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@drawable/shape_vod_list"
android:focusable="true"
android:focusableInTouchMode="true"
android:foreground="@drawable/selector_vod">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center_vertical"
android:orientation="horizontal">
<com.google.android.material.imageview.ShapeableImageView
android:id="@+id/image"
android:layout_width="48dp"
android:layout_height="48dp"
android:layout_margin="16dp"
android:scaleType="fitCenter"
app:shapeAppearanceOverlay="@style/Vod.Grid"
tools:src="@drawable/ic_img_error" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginEnd="16dp"
android:gravity="center_vertical"
android:orientation="vertical">
<TextView
android:id="@+id/name"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:singleLine="true"
android:textColor="@color/white"
android:textSize="16sp"
tools:text="蜘蛛人" />
<TextView
android:id="@+id/remark"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="2dp"
android:singleLine="true"
android:textColor="@color/white"
android:textSize="14sp"
tools:text="1080p" />
</LinearLayout>
</LinearLayout>
</FrameLayout>

@ -0,0 +1,82 @@
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="150dp"
android:layout_height="200dp"
android:focusable="true"
android:focusableInTouchMode="true">
<com.google.android.material.imageview.ShapeableImageView
android:id="@+id/image"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/black_20"
android:scaleType="center"
app:shapeAppearanceOverlay="@style/Vod.Grid"
tools:src="@drawable/ic_img_loading" />
<TextView
android:id="@+id/year"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="8dp"
android:background="#CC2196F3"
android:ellipsize="end"
android:padding="4dp"
android:singleLine="true"
android:textColor="@color/white"
android:textSize="14sp"
android:visibility="gone"
tools:text="2022"
tools:visibility="visible" />
<TextView
android:id="@+id/site"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="8dp"
android:background="#CCF44336"
android:ellipsize="end"
android:padding="4dp"
android:singleLine="true"
android:textColor="@color/white"
android:textSize="14sp"
android:visibility="gone"
tools:text="泥巴"
tools:visibility="visible" />
<TextView
android:id="@+id/remark"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_above="@+id/name"
android:background="#CC177535"
android:ellipsize="end"
android:padding="4dp"
android:singleLine="true"
android:textColor="@color/white"
android:textSize="14sp"
tools:text="1080p" />
<TextView
android:id="@+id/name"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:background="@drawable/shape_vod_name"
android:ellipsize="marquee"
android:gravity="center"
android:padding="6dp"
android:singleLine="true"
android:textColor="@color/white"
android:textSize="16sp"
tools:text="蜘蛛人" />
<View
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@drawable/selector_vod"
android:duplicateParentState="true" />
</RelativeLayout>
Loading…
Cancel
Save