Use leanback instead of RecyclerView

pull/2/head
FongMi 4 years ago
parent 768e92acab
commit 91f41186cc
  1. 3
      app/build.gradle
  2. 16
      app/src/main/java/com/fongmi/bear/ui/activity/HomeActivity.java
  3. 9
      app/src/main/java/com/fongmi/bear/ui/activity/SettingActivity.java
  4. 17
      app/src/main/java/com/fongmi/bear/ui/activity/VodActivity.java
  5. 35
      app/src/main/java/com/fongmi/bear/ui/adapter/PageAdapter.java
  6. 6
      app/src/main/java/com/fongmi/bear/ui/adapter/TypeAdapter.java
  7. 47
      app/src/main/java/com/fongmi/bear/ui/custom/SpaceItemDecoration.java
  8. 32
      app/src/main/java/com/fongmi/bear/ui/fragment/VodFragment.java
  9. 3
      app/src/main/java/com/fongmi/bear/utils/Notify.java
  10. 11
      app/src/main/res/layout/activity_home.xml
  11. 11
      app/src/main/res/layout/activity_vod.xml
  12. 4
      app/src/main/res/layout/adapter_filter.xml
  13. 1
      app/src/main/res/layout/adapter_type.xml
  14. 3
      app/src/main/res/layout/fragment_vod.xml
  15. 10
      app/src/main/res/layout/view_filter.xml

@ -35,6 +35,9 @@ android {
dependencies {
implementation 'androidx.appcompat:appcompat:1.4.2'
implementation 'androidx.preference:preference:1.2.0'
implementation 'androidx.leanback:leanback:1.2.0-alpha02'
implementation 'androidx.leanback:leanback-grid:1.0.0-alpha01'
implementation 'androidx.leanback:leanback-tab:1.1.0-beta01'
implementation 'androidx.lifecycle:lifecycle-extensions:2.2.0'
implementation 'androidx.recyclerview:recyclerview:1.2.1'
implementation 'androidx.room:room-runtime:2.4.2'

@ -2,11 +2,10 @@ package com.fongmi.bear.ui.activity;
import android.app.Activity;
import android.content.Intent;
import android.view.ViewGroup;
import androidx.annotation.Nullable;
import androidx.lifecycle.ViewModelProvider;
import androidx.recyclerview.widget.GridLayoutManager;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.viewbinding.ViewBinding;
import com.fongmi.bear.R;
@ -16,7 +15,7 @@ import com.fongmi.bear.databinding.ActivityHomeBinding;
import com.fongmi.bear.model.SiteViewModel;
import com.fongmi.bear.ui.adapter.FuncAdapter;
import com.fongmi.bear.ui.adapter.VodAdapter;
import com.fongmi.bear.ui.custom.SpaceItemDecoration;
import com.fongmi.bear.utils.ResUtil;
public class HomeActivity extends BaseActivity {
@ -48,13 +47,14 @@ public class HomeActivity extends BaseActivity {
}
private void setRecyclerView() {
mBinding.func.setHasFixedSize(true);
mBinding.func.setLayoutManager(new LinearLayoutManager(this, LinearLayoutManager.HORIZONTAL, false));
mBinding.func.setAdapter(mFuncAdapter = new FuncAdapter());
mBinding.recommend.setHasFixedSize(true);
mBinding.recommend.setLayoutManager(new GridLayoutManager(this, 5));
mBinding.recommend.addItemDecoration(new SpaceItemDecoration(5, 12, false, 0));
mBinding.func.setRowHeight(ViewGroup.LayoutParams.WRAP_CONTENT);
mBinding.recent.setNumColumns(5);
mBinding.recent.setAdapter(mVodAdapter = new VodAdapter());
mBinding.recent.setItemSpacing(ResUtil.dp2px(12));
mBinding.recommend.setNumColumns(5);
mBinding.recommend.setAdapter(mVodAdapter = new VodAdapter());
mBinding.recommend.setItemSpacing(ResUtil.dp2px(12));
}
private void setViewModel() {

@ -1,10 +1,13 @@
package com.fongmi.bear.ui.activity;
import android.app.Activity;
import android.content.DialogInterface;
import android.content.Intent;
import android.view.LayoutInflater;
import android.view.View;
import android.view.inputmethod.EditorInfo;
import androidx.appcompat.app.AlertDialog;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.viewbinding.ViewBinding;
@ -50,12 +53,16 @@ public class SettingActivity extends BaseActivity {
DialogConfigBinding bindingDialog = DialogConfigBinding.inflate(LayoutInflater.from(this));
bindingDialog.url.setText(Prefers.getUrl());
bindingDialog.url.setSelection(bindingDialog.url.getText().length());
Notify.show(this, bindingDialog.getRoot(), (dialogInterface, i) -> {
AlertDialog dialog = Notify.show(this, bindingDialog.getRoot(), (dialogInterface, i) -> {
Prefers.putUrl(bindingDialog.url.getText().toString().trim());
mBinding.url.setText(Prefers.getUrl());
Notify.progress(this);
loadConfig();
});
bindingDialog.url.setOnEditorActionListener((textView, actionId, event) -> {
if (actionId == EditorInfo.IME_ACTION_DONE) dialog.getButton(DialogInterface.BUTTON_POSITIVE).performClick();
return true;
});
}
private void loadConfig() {

@ -2,14 +2,15 @@ package com.fongmi.bear.ui.activity;
import android.app.Activity;
import android.content.Intent;
import android.view.ViewGroup;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.viewbinding.ViewBinding;
import com.fongmi.bear.bean.Result;
import com.fongmi.bear.databinding.ActivityVodBinding;
import com.fongmi.bear.ui.adapter.PageAdapter;
import com.fongmi.bear.ui.adapter.TypeAdapter;
import com.fongmi.bear.utils.ResUtil;
public class VodActivity extends BaseActivity {
@ -43,22 +44,18 @@ public class VodActivity extends BaseActivity {
protected void initEvent() {
mTypeAdapter.setOnItemClickListener(position -> {
mBinding.pager.setCurrentItem(position, false);
mTypeAdapter.setSelect(position);
});
}
private void setRecyclerView() {
mBinding.type.setHasFixedSize(true);
mBinding.type.getItemAnimator().setChangeDuration(0);
mBinding.type.setLayoutManager(new LinearLayoutManager(this, LinearLayoutManager.HORIZONTAL, false));
mBinding.type.setAdapter(mTypeAdapter = new TypeAdapter(mResult.getTypes()));
mBinding.type.scrollToPosition(0);
mTypeAdapter.setSelect(0);
mBinding.recycler.setNumRows(1);
mBinding.recycler.setHorizontalSpacing(ResUtil.dp2px(12));
mBinding.recycler.setRowHeight(ViewGroup.LayoutParams.WRAP_CONTENT);
mBinding.recycler.setAdapter(mTypeAdapter = new TypeAdapter(mResult.getTypes()));
}
private void setPager() {
mBinding.pager.setAdapter(new PageAdapter(this, mResult.getTypes(), mResult.getFilters()));
mBinding.pager.setAdapter(new PageAdapter(getSupportFragmentManager(), mResult));
if (mResult.getTypes().size() > 0) mBinding.pager.setOffscreenPageLimit(mResult.getTypes().size());
mBinding.pager.setUserInputEnabled(false);
}
}

@ -1,36 +1,37 @@
package com.fongmi.bear.ui.adapter;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentActivity;
import androidx.viewpager2.adapter.FragmentStateAdapter;
import androidx.fragment.app.FragmentManager;
import androidx.fragment.app.FragmentStatePagerAdapter;
import com.fongmi.bear.bean.Class;
import com.fongmi.bear.bean.Filter;
import com.fongmi.bear.bean.Result;
import com.fongmi.bear.ui.fragment.VodFragment;
import java.util.LinkedHashMap;
import java.util.List;
public class PageAdapter extends FragmentStatePagerAdapter {
public class PageAdapter extends FragmentStateAdapter {
private final Result mResult;
private final List<Class> mItems;
private final LinkedHashMap<String, List<Filter>> mFilters;
public PageAdapter(@NonNull FragmentManager fm, Result result) {
super(fm, BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT);
mResult = result;
}
public PageAdapter(@NonNull FragmentActivity activity, List<Class> items, LinkedHashMap<String, List<Filter>> filters) {
super(activity);
mItems = items;
mFilters = filters;
@Nullable
@Override
public CharSequence getPageTitle(int position) {
return mResult.getTypes().get(position).getTypeName();
}
@NonNull
@Override
public Fragment createFragment(int position) {
return VodFragment.newInstance(mItems.get(position).getTypeId(), mFilters.get(mItems.get(position).getTypeId()));
public Fragment getItem(int position) {
return VodFragment.newInstance(mResult.getTypes().get(position).getTypeId(), mResult.getFilters().get(mResult.getTypes().get(position).getTypeId()));
}
@Override
public int getItemCount() {
return mItems.size();
public int getCount() {
return mResult.getTypes().size();
}
}

@ -45,11 +45,6 @@ public class TypeAdapter extends RecyclerView.Adapter<TypeAdapter.ViewHolder> {
}
}
public void setSelect(int position) {
for (int i = 0; i < mItems.size(); i++) mItems.get(i).setSelect(i == position);
notifyItemRangeChanged(0, mItems.size());
}
@Override
public int getItemCount() {
return mItems.size();
@ -65,6 +60,5 @@ public class TypeAdapter extends RecyclerView.Adapter<TypeAdapter.ViewHolder> {
public void onBindViewHolder(@NonNull TypeAdapter.ViewHolder holder, int position) {
Class item = mItems.get(position);
holder.binding.name.setText(item.getTypeName());
holder.itemView.setSelected(item.isSelect());
}
}

@ -1,47 +0,0 @@
package com.fongmi.bear.ui.custom;
import android.graphics.Rect;
import android.view.View;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
import com.fongmi.bear.utils.ResUtil;
public class SpaceItemDecoration extends RecyclerView.ItemDecoration {
private final boolean includeEdge;
private final int spanCount;
private final int spacing;
private final int headerNum;
public SpaceItemDecoration(int spanCount, int spacing, boolean includeEdge, int headerNum) {
this.spanCount = spanCount;
this.spacing = ResUtil.dp2px(spacing);
this.includeEdge = includeEdge;
this.headerNum = headerNum;
}
@Override
public void getItemOffsets(@NonNull Rect outRect, @NonNull View view, RecyclerView parent, @NonNull RecyclerView.State state) {
int position = parent.getChildAdapterPosition(view) - headerNum;
if (position >= 0) {
int column = position % spanCount;
if (includeEdge) {
outRect.left = spacing - column * spacing / spanCount;
outRect.right = (column + 1) * spacing / spanCount;
if (position < spanCount) outRect.top = spacing;
outRect.bottom = spacing;
} else {
outRect.left = column * spacing / spanCount;
outRect.right = spacing - (column + 1) * spacing / spanCount;
if (position >= spanCount) outRect.top = spacing;
}
} else {
outRect.left = 0;
outRect.right = 0;
outRect.top = 0;
outRect.bottom = 0;
}
}
}

@ -4,14 +4,11 @@ import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.LinearLayout;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;
import androidx.lifecycle.ViewModelProvider;
import androidx.recyclerview.widget.GridLayoutManager;
import androidx.recyclerview.widget.LinearLayoutManager;
import com.fongmi.bear.bean.Filter;
import com.fongmi.bear.databinding.FragmentVodBinding;
@ -19,7 +16,6 @@ import com.fongmi.bear.databinding.ViewFilterBinding;
import com.fongmi.bear.model.SiteViewModel;
import com.fongmi.bear.ui.adapter.FilterAdapter;
import com.fongmi.bear.ui.adapter.VodAdapter;
import com.fongmi.bear.ui.custom.SpaceItemDecoration;
import com.fongmi.bear.utils.ResUtil;
import com.google.gson.Gson;
@ -40,10 +36,10 @@ public class VodFragment extends Fragment {
return getArguments().getString("filter");
}
public static VodFragment newInstance(String typeId, List<Filter> filters) {
public static VodFragment newInstance(String typeId, List<Filter> filter) {
Bundle args = new Bundle();
args.putString("typeId", typeId);
args.putString("filter", new Gson().toJson(filters));
args.putString("filter", new Gson().toJson(filter));
VodFragment fragment = new VodFragment();
fragment.setArguments(args);
return fragment;
@ -60,14 +56,13 @@ public class VodFragment extends Fragment {
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
setRecyclerView();
setViewModel();
setFilters();
getContent();
setFilter();
}
private void setRecyclerView() {
mBinding.recycler.setHasFixedSize(true);
mBinding.recycler.setLayoutManager(new GridLayoutManager(getContext(), 5));
mBinding.recycler.addItemDecoration(new SpaceItemDecoration(5, 12, false, 0));
mBinding.recycler.setNumColumns(5);
mBinding.recycler.setItemSpacing(ResUtil.dp2px(12));
mBinding.recycler.setAdapter(mVodAdapter = new VodAdapter());
}
@ -84,24 +79,17 @@ public class VodFragment extends Fragment {
mSiteViewModel.categoryContent(getTypeId(), "1", true, new HashMap<>());
}
private void setFilters() {
List<Filter> filters = Filter.arrayFrom(getFilter());
for (Filter filter : filters) {
private void setFilter() {
for (Filter filter : Filter.arrayFrom(getFilter())) {
ViewFilterBinding binding = ViewFilterBinding.inflate(getLayoutInflater());
LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);
params.bottomMargin = ResUtil.dp2px(12);
FilterAdapter adapter = new FilterAdapter(filter.getValue());
adapter.setOnItemClickListener(new FilterAdapter.OnItemClickListener() {
@Override
public void onItemClick(int position) {
adapter.setOnItemClickListener(position -> {
}
});
binding.name.setText(filter.getName());
binding.recycler.setHasFixedSize(true);
binding.recycler.setLayoutManager(new LinearLayoutManager(getContext(), LinearLayoutManager.HORIZONTAL, false));
binding.recycler.setAdapter(adapter);
mBinding.filter.addView(binding.getRoot(), params);
binding.recycler.setRowHeight(ViewGroup.LayoutParams.WRAP_CONTENT);
mBinding.filter.addView(binding.getRoot());
}
}
}

@ -47,10 +47,11 @@ public class Notify {
dialog.show();
}
public static void show(Context context, View view, DialogInterface.OnClickListener listener) {
public static AlertDialog show(Context context, View view, DialogInterface.OnClickListener listener) {
AlertDialog dialog = new MaterialAlertDialogBuilder(context).setView(view).setNegativeButton(R.string.dialog_negative, null).setPositiveButton(R.string.dialog_positive, listener).create();
dialog.getWindow().setDimAmount(0);
dialog.show();
return dialog;
}
public static void progress(Context context) {

@ -17,9 +17,9 @@
android:textColor="@color/white"
android:textSize="24sp" />
<androidx.recyclerview.widget.RecyclerView
<androidx.leanback.widget.HorizontalGridView
android:id="@+id/func"
android:layout_width="wrap_content"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="16dp"
android:nestedScrollingEnabled="false"
@ -33,12 +33,13 @@
android:textColor="@color/white"
android:textSize="24sp" />
<androidx.recyclerview.widget.RecyclerView
<androidx.leanback.widget.VerticalGridView
android:id="@+id/recent"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="16dp"
android:nestedScrollingEnabled="false" />
android:nestedScrollingEnabled="false"
android:visibility="gone" />
<TextView
android:layout_width="wrap_content"
@ -54,7 +55,7 @@
android:layout_height="match_parent"
android:layout_marginTop="16dp">
<androidx.recyclerview.widget.RecyclerView
<androidx.leanback.widget.VerticalGridView
android:id="@+id/recommend"
android:layout_width="match_parent"
android:layout_height="match_parent"

@ -10,16 +10,17 @@
android:orientation="vertical"
android:padding="16dp">
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/type"
<androidx.leanback.widget.HorizontalGridView
android:id="@+id/recycler"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
android:layout_height="wrap_content"
android:nestedScrollingEnabled="false" />
<androidx.viewpager2.widget.ViewPager2
<androidx.leanback.tab.LeanbackViewPager
android:id="@+id/pager"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginTop="16dp" />
android:layout_marginTop="12dp" />
</LinearLayout>
</androidx.core.widget.NestedScrollView>

@ -3,9 +3,9 @@
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginEnd="12dp"
android:background="@drawable/selector_item"
android:background="@drawable/selector_type"
android:focusable="true"
android:layout_margin="4dp"
android:focusableInTouchMode="true">
<TextView

@ -3,7 +3,6 @@
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginEnd="12dp"
android:background="@drawable/selector_type"
android:focusable="true"
android:focusableInTouchMode="true">

@ -8,9 +8,10 @@
android:id="@+id/filter"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="12dp"
android:orientation="vertical" />
<androidx.recyclerview.widget.RecyclerView
<androidx.leanback.widget.VerticalGridView
android:id="@+id/recycler"
android:layout_width="match_parent"
android:layout_height="match_parent"

@ -3,22 +3,22 @@
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:orientation="horizontal">
<TextView
android:id="@+id/name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginEnd="12dp"
android:background="@drawable/shape_item_normal"
android:layout_marginEnd="4dp"
android:background="@drawable/selector_type"
android:textColor="@color/white"
android:textSize="16sp"
tools:text="地區" />
<androidx.recyclerview.widget.RecyclerView
<androidx.leanback.widget.HorizontalGridView
android:id="@+id/recycler"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
android:layout_height="wrap_content"
android:nestedScrollingEnabled="false" />
</LinearLayout>
Loading…
Cancel
Save