From 91f41186cc119be0de5113028017677fe50378e0 Mon Sep 17 00:00:00 2001 From: FongMi Date: Wed, 29 Jun 2022 00:06:55 +0800 Subject: [PATCH] Use leanback instead of RecyclerView --- app/build.gradle | 3 ++ .../fongmi/bear/ui/activity/HomeActivity.java | 16 +++---- .../bear/ui/activity/SettingActivity.java | 9 +++- .../fongmi/bear/ui/activity/VodActivity.java | 17 +++---- .../fongmi/bear/ui/adapter/PageAdapter.java | 35 +++++++------- .../fongmi/bear/ui/adapter/TypeAdapter.java | 6 --- .../bear/ui/custom/SpaceItemDecoration.java | 47 ------------------- .../fongmi/bear/ui/fragment/VodFragment.java | 32 ++++--------- .../java/com/fongmi/bear/utils/Notify.java | 3 +- app/src/main/res/layout/activity_home.xml | 11 +++-- app/src/main/res/layout/activity_vod.xml | 11 +++-- app/src/main/res/layout/adapter_filter.xml | 4 +- app/src/main/res/layout/adapter_type.xml | 1 - app/src/main/res/layout/fragment_vod.xml | 3 +- app/src/main/res/layout/view_filter.xml | 10 ++-- 15 files changed, 77 insertions(+), 131 deletions(-) delete mode 100644 app/src/main/java/com/fongmi/bear/ui/custom/SpaceItemDecoration.java diff --git a/app/build.gradle b/app/build.gradle index 6229faf8f..d523b4894 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -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' diff --git a/app/src/main/java/com/fongmi/bear/ui/activity/HomeActivity.java b/app/src/main/java/com/fongmi/bear/ui/activity/HomeActivity.java index 41135dd4c..826fbdab1 100644 --- a/app/src/main/java/com/fongmi/bear/ui/activity/HomeActivity.java +++ b/app/src/main/java/com/fongmi/bear/ui/activity/HomeActivity.java @@ -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() { diff --git a/app/src/main/java/com/fongmi/bear/ui/activity/SettingActivity.java b/app/src/main/java/com/fongmi/bear/ui/activity/SettingActivity.java index e373fde1d..576204285 100644 --- a/app/src/main/java/com/fongmi/bear/ui/activity/SettingActivity.java +++ b/app/src/main/java/com/fongmi/bear/ui/activity/SettingActivity.java @@ -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() { diff --git a/app/src/main/java/com/fongmi/bear/ui/activity/VodActivity.java b/app/src/main/java/com/fongmi/bear/ui/activity/VodActivity.java index 25d86942e..2ced6a4d8 100644 --- a/app/src/main/java/com/fongmi/bear/ui/activity/VodActivity.java +++ b/app/src/main/java/com/fongmi/bear/ui/activity/VodActivity.java @@ -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); } } diff --git a/app/src/main/java/com/fongmi/bear/ui/adapter/PageAdapter.java b/app/src/main/java/com/fongmi/bear/ui/adapter/PageAdapter.java index f25addcbc..48e9bad9c 100644 --- a/app/src/main/java/com/fongmi/bear/ui/adapter/PageAdapter.java +++ b/app/src/main/java/com/fongmi/bear/ui/adapter/PageAdapter.java @@ -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 mItems; - private final LinkedHashMap> mFilters; + public PageAdapter(@NonNull FragmentManager fm, Result result) { + super(fm, BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT); + mResult = result; + } - public PageAdapter(@NonNull FragmentActivity activity, List items, LinkedHashMap> 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(); } } \ No newline at end of file diff --git a/app/src/main/java/com/fongmi/bear/ui/adapter/TypeAdapter.java b/app/src/main/java/com/fongmi/bear/ui/adapter/TypeAdapter.java index 67bb977f9..18aded387 100644 --- a/app/src/main/java/com/fongmi/bear/ui/adapter/TypeAdapter.java +++ b/app/src/main/java/com/fongmi/bear/ui/adapter/TypeAdapter.java @@ -45,11 +45,6 @@ public class TypeAdapter extends RecyclerView.Adapter { } } - 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 { 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()); } } diff --git a/app/src/main/java/com/fongmi/bear/ui/custom/SpaceItemDecoration.java b/app/src/main/java/com/fongmi/bear/ui/custom/SpaceItemDecoration.java deleted file mode 100644 index dfd9f873a..000000000 --- a/app/src/main/java/com/fongmi/bear/ui/custom/SpaceItemDecoration.java +++ /dev/null @@ -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; - } - } -} \ No newline at end of file diff --git a/app/src/main/java/com/fongmi/bear/ui/fragment/VodFragment.java b/app/src/main/java/com/fongmi/bear/ui/fragment/VodFragment.java index bf5d198c6..0a50fe393 100644 --- a/app/src/main/java/com/fongmi/bear/ui/fragment/VodFragment.java +++ b/app/src/main/java/com/fongmi/bear/ui/fragment/VodFragment.java @@ -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 filters) { + public static VodFragment newInstance(String typeId, List 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 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()); } } } diff --git a/app/src/main/java/com/fongmi/bear/utils/Notify.java b/app/src/main/java/com/fongmi/bear/utils/Notify.java index 4124468a4..6d71516f3 100644 --- a/app/src/main/java/com/fongmi/bear/utils/Notify.java +++ b/app/src/main/java/com/fongmi/bear/utils/Notify.java @@ -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) { diff --git a/app/src/main/res/layout/activity_home.xml b/app/src/main/res/layout/activity_home.xml index bea68d8f8..c6d67f22e 100644 --- a/app/src/main/res/layout/activity_home.xml +++ b/app/src/main/res/layout/activity_home.xml @@ -17,9 +17,9 @@ android:textColor="@color/white" android:textSize="24sp" /> - - + android:nestedScrollingEnabled="false" + android:visibility="gone" /> - - + android:layout_height="wrap_content" + android:nestedScrollingEnabled="false" /> - + android:layout_marginTop="12dp" /> diff --git a/app/src/main/res/layout/adapter_filter.xml b/app/src/main/res/layout/adapter_filter.xml index 14589072e..4bf077f29 100644 --- a/app/src/main/res/layout/adapter_filter.xml +++ b/app/src/main/res/layout/adapter_filter.xml @@ -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"> diff --git a/app/src/main/res/layout/fragment_vod.xml b/app/src/main/res/layout/fragment_vod.xml index 736008bd0..71a1d1907 100644 --- a/app/src/main/res/layout/fragment_vod.xml +++ b/app/src/main/res/layout/fragment_vod.xml @@ -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" /> - - + android:layout_height="wrap_content" + android:nestedScrollingEnabled="false" /> \ No newline at end of file