[mobile] support multi view type

pull/137/head
FongMi 2 years ago
parent ced887b0d3
commit 4673d0f4c5
  1. 9
      app/src/main/java/com/fongmi/android/tv/bean/Site.java
  2. 11
      app/src/main/java/com/fongmi/android/tv/bean/Vod.java
  3. 5
      app/src/main/res/values/styles.xml
  4. 20
      app/src/mobile/java/com/fongmi/android/tv/Product.java
  5. 15
      app/src/mobile/java/com/fongmi/android/tv/ui/activity/CollectActivity.java
  6. 52
      app/src/mobile/java/com/fongmi/android/tv/ui/adapter/VodAdapter.java
  7. 17
      app/src/mobile/java/com/fongmi/android/tv/ui/base/BaseVodHolder.java
  8. 8
      app/src/mobile/java/com/fongmi/android/tv/ui/base/ViewType.java
  9. 25
      app/src/mobile/java/com/fongmi/android/tv/ui/fragment/TypeFragment.java
  10. 5
      app/src/mobile/java/com/fongmi/android/tv/ui/holder/VodFolderHolder.java
  11. 23
      app/src/mobile/java/com/fongmi/android/tv/ui/holder/VodFullHolder.java
  12. 11
      app/src/mobile/java/com/fongmi/android/tv/ui/holder/VodGridHolder.java
  13. 5
      app/src/mobile/java/com/fongmi/android/tv/ui/holder/VodListHolder.java
  14. 34
      app/src/mobile/java/com/fongmi/android/tv/ui/holder/VodOvalHolder.java
  15. 9
      app/src/mobile/res/drawable/shape_vod_circle.xml
  16. 16
      app/src/mobile/res/layout/adapter_vod_full.xml
  17. 19
      app/src/mobile/res/layout/adapter_vod_oval.xml

@ -8,13 +8,14 @@ import androidx.room.PrimaryKey;
import com.fongmi.android.tv.db.AppDatabase;
import com.fongmi.android.tv.gson.StringAdapter;
import com.fongmi.android.tv.ui.base.ViewType;
import com.google.gson.JsonElement;
import com.google.gson.annotations.SerializedName;
import java.util.Collections;
import java.util.List;
@Entity(ignoredColumns = {"type", "api", "playUrl", "playerType", "ext", "jar", "categories"})
@Entity(ignoredColumns = {"type", "api", "playUrl", "viewType", "playerType", "ext", "jar", "categories"})
public class Site {
@NonNull
@ -29,6 +30,8 @@ public class Site {
private String api;
@SerializedName("playUrl")
private String playUrl;
@SerializedName("viewType")
private Integer viewType;
@SerializedName("playerType")
private Integer playerType;
@SerializedName("searchable")
@ -101,6 +104,10 @@ public class Site {
this.api = api;
}
public Integer getViewType() {
return viewType == null ? ViewType.GRID : viewType;
}
public String getPlayUrl() {
return TextUtils.isEmpty(playUrl) ? "" : playUrl;
}

@ -5,6 +5,7 @@ import android.view.View;
import androidx.annotation.NonNull;
import com.fongmi.android.tv.ui.base.ViewType;
import com.fongmi.android.tv.utils.Trans;
import com.fongmi.android.tv.utils.Utils;
import com.google.gson.Gson;
@ -200,8 +201,14 @@ public class Vod {
return getVodTag().equals("folder") || getVodTag().equals("cover");
}
public boolean isList(boolean folder) {
return getVodShow().isEmpty() ? folder : getVodShow().equals("list");
public int getViewType(int viewType) {
if (getVodShow().isEmpty()) return viewType;
if (getVodShow().equals("grid")) return ViewType.GRID;
if (getVodShow().equals("land")) return ViewType.LAND;
if (getVodShow().equals("oval")) return ViewType.OVAL;
if (getVodShow().equals("full")) return ViewType.FULL;
if (getVodShow().equals("list")) return ViewType.FOLDER;
return ViewType.GRID;
}
public String getVodName(String name) {

@ -8,6 +8,11 @@
<item name="cornerSize">8dp</item>
</style>
<style name="Vod.Circle">
<item name="cornerFamily">rounded</item>
<item name="cornerSize">50%</item>
</style>
<style name="Vod.List">
<item name="cornerSizeTopLeft">8dp</item>
<item name="cornerSizeBottomLeft">8dp</item>

@ -2,6 +2,7 @@ package com.fongmi.android.tv;
import android.content.Context;
import com.fongmi.android.tv.ui.base.ViewType;
import com.fongmi.android.tv.utils.ResUtil;
public class Product {
@ -18,13 +19,26 @@ public class Product {
}
public static int[] getSpec(Context context) {
return getSpec(context, ResUtil.dp2px(32) + ResUtil.dp2px(16 * (getColumn() - 1)), getColumn());
return getSpec(context, ViewType.GRID);
}
public static int[] getSpec(Context context, int viewType) {
return getSpec(context, ResUtil.dp2px(32) + ResUtil.dp2px(16 * (getColumn() - 1)), getColumn(), viewType);
}
public static int[] getSpec(Context context, int space, int column) {
return getSpec(context, space, column, ViewType.GRID);
}
public static int[] getSpec(Context context, int space, int column, int viewType) {
int base = ResUtil.getScreenWidth(context) - space;
int width = base / column;
int height = (int) (width / 0.75f);
return new int[]{width, height};
return new int[]{width, getHeight(viewType, width)};
}
private static int getHeight(int viewType, int value) {
if (viewType == ViewType.GRID) return (int) (value / 0.75f);
if (viewType == ViewType.LAND) return (int) (value * 0.75f);
return value;
}
}

@ -92,7 +92,6 @@ public class CollectActivity extends BaseActivity implements CustomScroller.Call
mScroller = new CustomScroller(this);
mSites = new ArrayList<>();
setRecyclerView();
setLayoutSize();
setViewModel();
checkKeyword();
setViewType();
@ -129,18 +128,13 @@ public class CollectActivity extends BaseActivity implements CustomScroller.Call
mBinding.wordRecycler.setAdapter(mWordAdapter = new WordAdapter(this));
mBinding.recordRecycler.setHasFixedSize(true);
mBinding.recordRecycler.setAdapter(mRecordAdapter = new RecordAdapter(this));
mVodAdapter.setSize(Product.getSpec(this, ResUtil.dp2px(64), 3));
}
private void setViewType() {
mVodAdapter.setViewType(Setting.getViewType());
boolean grid = mVodAdapter.getViewType() == ViewType.GRID;
GridLayoutManager manager = (GridLayoutManager) mBinding.recycler.getLayoutManager();
mBinding.view.setImageResource(grid ? R.drawable.ic_action_list : R.drawable.ic_action_grid);
manager.setSpanCount(grid ? 2 : 1);
}
private void setLayoutSize() {
mVodAdapter.setSize(Product.getSpec(this, ResUtil.dp2px(64), 3));
((GridLayoutManager) mBinding.recycler.getLayoutManager()).setSpanCount(mVodAdapter.isGrid() ? 2 : 1);
mBinding.view.setImageResource(mVodAdapter.isGrid() ? R.drawable.ic_action_list : R.drawable.ic_action_grid);
RelativeLayout.LayoutParams params = (RelativeLayout.LayoutParams) mBinding.collect.getLayoutParams();
params.width = mVodAdapter.getWidth() + ResUtil.dp2px(24);
mBinding.collect.setLayoutParams(params);
@ -224,8 +218,7 @@ public class CollectActivity extends BaseActivity implements CustomScroller.Call
}
private void toggleView(View view) {
mVodAdapter.setViewType(mVodAdapter.getViewType() == ViewType.GRID ? ViewType.LIST : ViewType.GRID);
Setting.putViewType(mVodAdapter.getViewType());
Setting.putViewType(mVodAdapter.isGrid() ? ViewType.LIST : ViewType.GRID);
setViewType();
}

@ -8,22 +8,27 @@ import androidx.recyclerview.widget.RecyclerView;
import com.fongmi.android.tv.bean.Vod;
import com.fongmi.android.tv.databinding.AdapterVodFolderBinding;
import com.fongmi.android.tv.databinding.AdapterVodFullBinding;
import com.fongmi.android.tv.databinding.AdapterVodGridBinding;
import com.fongmi.android.tv.databinding.AdapterVodListBinding;
import com.fongmi.android.tv.databinding.AdapterVodOvalBinding;
import com.fongmi.android.tv.ui.base.BaseVodHolder;
import com.fongmi.android.tv.ui.base.ViewType;
import com.fongmi.android.tv.ui.holder.VodFolderHolder;
import com.fongmi.android.tv.ui.holder.VodFullHolder;
import com.fongmi.android.tv.ui.holder.VodGridHolder;
import com.fongmi.android.tv.ui.holder.VodListHolder;
import com.fongmi.android.tv.ui.holder.VodOvalHolder;
import java.util.ArrayList;
import java.util.List;
public class VodAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
public class VodAdapter extends RecyclerView.Adapter<BaseVodHolder> {
private final OnClickListener mListener;
private final List<Vod> mItems;
private int width, height;
private int viewType;
private int[] size;
public VodAdapter(OnClickListener listener) {
this.mListener = listener;
@ -39,12 +44,11 @@ public class VodAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
}
public void setSize(int[] size) {
this.width = size[0];
this.height = size[1];
this.size = size;
}
public int getWidth() {
return width;
return size[0];
}
public int getViewType() {
@ -55,6 +59,14 @@ public class VodAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
this.viewType = viewType;
}
public boolean isList() {
return viewType == ViewType.LIST || viewType == ViewType.FOLDER || viewType == ViewType.FULL;
}
public boolean isGrid() {
return viewType == ViewType.GRID || viewType == ViewType.LAND || viewType == ViewType.OVAL;
}
public void addAll(List<Vod> items) {
int position = mItems.size() + 1;
mItems.addAll(items);
@ -77,29 +89,25 @@ public class VodAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
return viewType;
}
@NonNull
@Override
public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
if (viewType == ViewType.FOLDER) return new VodFolderHolder(AdapterVodFolderBinding.inflate(LayoutInflater.from(parent.getContext()), parent, false), mListener);
if (viewType == ViewType.LIST) return new VodListHolder(AdapterVodListBinding.inflate(LayoutInflater.from(parent.getContext()), parent, false), mListener);
VodGridHolder holder = new VodGridHolder(AdapterVodGridBinding.inflate(LayoutInflater.from(parent.getContext()), parent, false), mListener);
holder.itemView.getLayoutParams().width = width;
holder.itemView.getLayoutParams().height = height;
return holder;
public void onBindViewHolder(@NonNull BaseVodHolder holder, int position) {
holder.initView(mItems.get(position));
}
@NonNull
@Override
public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {
public BaseVodHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
switch (viewType) {
case ViewType.GRID:
((VodGridHolder) holder).initView(mItems.get(position));
break;
case ViewType.LIST:
((VodListHolder) holder).initView(mItems.get(position));
break;
case ViewType.FOLDER:
((VodFolderHolder) holder).initView(mItems.get(position));
break;
return new VodFolderHolder(AdapterVodFolderBinding.inflate(LayoutInflater.from(parent.getContext()), parent, false), mListener);
case ViewType.LIST:
return new VodListHolder(AdapterVodListBinding.inflate(LayoutInflater.from(parent.getContext()), parent, false), mListener);
case ViewType.FULL:
return new VodFullHolder(AdapterVodFullBinding.inflate(LayoutInflater.from(parent.getContext()), parent, false));
case ViewType.OVAL:
return new VodOvalHolder(AdapterVodOvalBinding.inflate(LayoutInflater.from(parent.getContext()), parent, false), mListener).size(size);
default:
return new VodGridHolder(AdapterVodGridBinding.inflate(LayoutInflater.from(parent.getContext()), parent, false), mListener).size(size);
}
}
}

@ -0,0 +1,17 @@
package com.fongmi.android.tv.ui.base;
import android.view.View;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
import com.fongmi.android.tv.bean.Vod;
public abstract class BaseVodHolder extends RecyclerView.ViewHolder {
public BaseVodHolder(@NonNull View itemView) {
super(itemView);
}
public abstract void initView(Vod item);
}

@ -3,8 +3,12 @@ package com.fongmi.android.tv.ui.base;
public class ViewType {
public static final int GRID = 0;
public static final int LIST = 1;
public static final int FOLDER = 2;
public static final int LAND = 1;
public static final int OVAL = 2;
public static final int FULL = 3;
public static final int LIST = 98;
public static final int FOLDER = 99;
public static final int DARK = 0;
public static final int LIGHT = 1;

@ -13,8 +13,10 @@ import androidx.swiperefreshlayout.widget.SwipeRefreshLayout;
import androidx.viewbinding.ViewBinding;
import com.fongmi.android.tv.Product;
import com.fongmi.android.tv.api.ApiConfig;
import com.fongmi.android.tv.bean.Page;
import com.fongmi.android.tv.bean.Result;
import com.fongmi.android.tv.bean.Site;
import com.fongmi.android.tv.bean.Vod;
import com.fongmi.android.tv.databinding.FragmentTypeBinding;
import com.fongmi.android.tv.model.SiteViewModel;
@ -65,6 +67,10 @@ public class TypeFragment extends BaseFragment implements CustomScroller.Callbac
return getTypeId().equals("home");
}
private Site getSite() {
return ApiConfig.get().getSite(getKey());
}
private VodFragment getParent() {
return (VodFragment) getParentFragment();
}
@ -73,6 +79,10 @@ public class TypeFragment extends BaseFragment implements CustomScroller.Callbac
return mPages.get(mPages.size() - 1);
}
private int getDefaultViewType() {
return isFolder() ? ViewType.FOLDER : getSite().getViewType();
}
@Override
protected ViewBinding getBinding(@NonNull LayoutInflater inflater, @Nullable ViewGroup container) {
return mBinding = FragmentTypeBinding.inflate(inflater, container, false);
@ -103,13 +113,13 @@ public class TypeFragment extends BaseFragment implements CustomScroller.Callbac
private void setRecyclerView() {
mBinding.recycler.setHasFixedSize(true);
mBinding.recycler.setAdapter(mAdapter = new VodAdapter(this));
mAdapter.setSize(Product.getSpec(getActivity()));
setViewType(isFolder());
setViewType(getDefaultViewType());
}
private void setViewType(boolean folder) {
mBinding.recycler.setLayoutManager(folder ? new LinearLayoutManager(getActivity()) : new GridLayoutManager(getContext(), Product.getColumn()));
mAdapter.setViewType(folder ? ViewType.FOLDER : ViewType.GRID);
private void setViewType(int viewType) {
mAdapter.setViewType(viewType);
mAdapter.setSize(Product.getSpec(getActivity(), viewType));
mBinding.recycler.setLayoutManager(mAdapter.isList() ? new LinearLayoutManager(getActivity()) : new GridLayoutManager(getContext(), Product.getColumn()));
}
private void setViewModel() {
@ -141,9 +151,8 @@ public class TypeFragment extends BaseFragment implements CustomScroller.Callbac
private void addVideo(List<Vod> items) {
if (items.isEmpty()) return;
boolean list = items.get(0).isList(isFolder());
int viewType = list ? ViewType.FOLDER : ViewType.GRID;
if (viewType != mAdapter.getViewType()) setViewType(list);
int viewType = items.get(0).getViewType(getDefaultViewType());
if (viewType != mAdapter.getViewType()) setViewType(viewType);
mAdapter.addAll(items);
}

@ -3,14 +3,14 @@ package com.fongmi.android.tv.ui.holder;
import android.widget.ImageView;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
import com.fongmi.android.tv.bean.Vod;
import com.fongmi.android.tv.databinding.AdapterVodFolderBinding;
import com.fongmi.android.tv.ui.adapter.VodAdapter;
import com.fongmi.android.tv.ui.base.BaseVodHolder;
import com.fongmi.android.tv.utils.ImgUtil;
public class VodFolderHolder extends RecyclerView.ViewHolder {
public class VodFolderHolder extends BaseVodHolder {
private final VodAdapter.OnClickListener listener;
private final AdapterVodFolderBinding binding;
@ -21,6 +21,7 @@ public class VodFolderHolder extends RecyclerView.ViewHolder {
this.listener = listener;
}
@Override
public void initView(Vod item) {
binding.name.setText(item.getVodName());
binding.remark.setText(item.getVodRemarks());

@ -0,0 +1,23 @@
package com.fongmi.android.tv.ui.holder;
import androidx.annotation.NonNull;
import com.fongmi.android.tv.bean.Vod;
import com.fongmi.android.tv.databinding.AdapterVodFullBinding;
import com.fongmi.android.tv.ui.base.BaseVodHolder;
import com.fongmi.android.tv.utils.ImgUtil;
public class VodFullHolder extends BaseVodHolder {
private final AdapterVodFullBinding binding;
public VodFullHolder(@NonNull AdapterVodFullBinding binding) {
super(binding.getRoot());
this.binding = binding;
}
@Override
public void initView(Vod item) {
ImgUtil.load(item.getVodPic(), binding.image);
}
}

@ -1,14 +1,14 @@
package com.fongmi.android.tv.ui.holder;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
import com.fongmi.android.tv.bean.Vod;
import com.fongmi.android.tv.databinding.AdapterVodGridBinding;
import com.fongmi.android.tv.ui.adapter.VodAdapter;
import com.fongmi.android.tv.ui.base.BaseVodHolder;
import com.fongmi.android.tv.utils.ImgUtil;
public class VodGridHolder extends RecyclerView.ViewHolder {
public class VodGridHolder extends BaseVodHolder {
private final VodAdapter.OnClickListener listener;
private final AdapterVodGridBinding binding;
@ -19,6 +19,13 @@ public class VodGridHolder extends RecyclerView.ViewHolder {
this.listener = listener;
}
public VodGridHolder size(int[] size) {
this.itemView.getLayoutParams().width = size[0];
this.itemView.getLayoutParams().height = size[1];
return this;
}
@Override
public void initView(Vod item) {
binding.name.setText(item.getVodName());
binding.year.setText(item.getVodYear());

@ -1,14 +1,14 @@
package com.fongmi.android.tv.ui.holder;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
import com.fongmi.android.tv.bean.Vod;
import com.fongmi.android.tv.databinding.AdapterVodListBinding;
import com.fongmi.android.tv.ui.adapter.VodAdapter;
import com.fongmi.android.tv.ui.base.BaseVodHolder;
import com.fongmi.android.tv.utils.ImgUtil;
public class VodListHolder extends RecyclerView.ViewHolder {
public class VodListHolder extends BaseVodHolder {
private final VodAdapter.OnClickListener listener;
private final AdapterVodListBinding binding;
@ -19,6 +19,7 @@ public class VodListHolder extends RecyclerView.ViewHolder {
this.listener = listener;
}
@Override
public void initView(Vod item) {
binding.name.setText(item.getVodName());
binding.year.setText(item.getVodYear());

@ -0,0 +1,34 @@
package com.fongmi.android.tv.ui.holder;
import androidx.annotation.NonNull;
import com.fongmi.android.tv.bean.Vod;
import com.fongmi.android.tv.databinding.AdapterVodOvalBinding;
import com.fongmi.android.tv.ui.adapter.VodAdapter;
import com.fongmi.android.tv.ui.base.BaseVodHolder;
import com.fongmi.android.tv.utils.ImgUtil;
public class VodOvalHolder extends BaseVodHolder {
private final VodAdapter.OnClickListener listener;
private final AdapterVodOvalBinding binding;
public VodOvalHolder(@NonNull AdapterVodOvalBinding binding, VodAdapter.OnClickListener listener) {
super(binding.getRoot());
this.binding = binding;
this.listener = listener;
}
public VodOvalHolder size(int[] size) {
this.itemView.getLayoutParams().width = size[0];
this.itemView.getLayoutParams().height = size[1];
return this;
}
@Override
public void initView(Vod item) {
ImgUtil.load(item.getVodPic(), binding.image);
binding.getRoot().setOnClickListener(v -> listener.onItemClick(item));
binding.getRoot().setOnLongClickListener(v -> listener.onLongClick(item));
}
}

@ -0,0 +1,9 @@
<?xml version="1.0" encoding="utf-8"?>
<ripple xmlns:android="http://schemas.android.com/apk/res/android"
android:color="?attr/colorControlHighlight">
<item android:id="@android:id/mask">
<shape android:shape="oval">
<solid android:color="@android:color/white" />
</shape>
</item>
</ripple>

@ -0,0 +1,16 @@
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_margin="8dp">
<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"
tools:src="@drawable/ic_img_loading" />
</RelativeLayout>

@ -0,0 +1,19 @@
<?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="150dp"
android:layout_margin="8dp"
android:foreground="@drawable/shape_vod_circle">
<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.Circle"
tools:src="@drawable/ic_img_loading" />
</RelativeLayout>
Loading…
Cancel
Save