Site dialog use leanback

pull/2/head
FongMi 4 years ago
parent f902612714
commit 22487a2ece
  1. 4
      app/src/main/java/com/fongmi/bear/bean/Site.java
  2. 3
      app/src/main/java/com/fongmi/bear/ui/activity/HomeActivity.java
  3. 27
      app/src/main/java/com/fongmi/bear/ui/activity/SettingActivity.java
  4. 32
      app/src/main/java/com/fongmi/bear/ui/activity/VodActivity.java
  5. 30
      app/src/main/java/com/fongmi/bear/ui/adapter/PageAdapter.java
  6. 81
      app/src/main/java/com/fongmi/bear/ui/adapter/SiteAdapter.java
  7. 3
      app/src/main/java/com/fongmi/bear/ui/fragment/VodFragment.java
  8. 51
      app/src/main/java/com/fongmi/bear/ui/presenter/SitePresenter.java
  9. 22
      app/src/main/java/com/fongmi/bear/utils/Notify.java
  10. 2
      app/src/main/res/drawable/selector_site.xml
  11. 24
      app/src/main/res/layout/adapter_site.xml
  12. 16
      app/src/main/res/layout/dialog_site.xml

@ -103,6 +103,10 @@ public class Site {
this.home = home;
}
public void setActivated(Site item) {
this.home = item.equals(this);
}
@Override
public boolean equals(Object obj) {
if (this == obj) return true;

@ -61,9 +61,8 @@ public class HomeActivity extends BaseActivity {
selector.addPresenter(String.class, new TitlePresenter());
selector.addPresenter(ListRow.class, new CustomRowPresenter(16), VodPresenter.class);
selector.addPresenter(ListRow.class, new CustomRowPresenter(16), FuncPresenter.class);
ItemBridgeAdapter adapter = new ItemBridgeAdapter(mAdapter = new ArrayObjectAdapter(selector));
mBinding.recycler.setVerticalSpacing(ResUtil.dp2px(16));
mBinding.recycler.setAdapter(adapter);
mBinding.recycler.setAdapter(new ItemBridgeAdapter(mAdapter = new ArrayObjectAdapter(selector)));
}
private void setViewModel() {

@ -8,7 +8,8 @@ import android.view.View;
import android.view.inputmethod.EditorInfo;
import androidx.appcompat.app.AlertDialog;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.leanback.widget.ArrayObjectAdapter;
import androidx.leanback.widget.ItemBridgeAdapter;
import androidx.viewbinding.ViewBinding;
import com.fongmi.bear.ApiConfig;
@ -17,14 +18,14 @@ import com.fongmi.bear.databinding.ActivitySettingBinding;
import com.fongmi.bear.databinding.DialogConfigBinding;
import com.fongmi.bear.databinding.DialogSiteBinding;
import com.fongmi.bear.net.Callback;
import com.fongmi.bear.ui.adapter.SiteAdapter;
import com.fongmi.bear.ui.presenter.SitePresenter;
import com.fongmi.bear.utils.Notify;
import com.fongmi.bear.utils.Prefers;
import com.fongmi.bear.utils.ResUtil;
public class SettingActivity extends BaseActivity {
private ActivitySettingBinding mBinding;
private SiteAdapter mAdapter;
public static void start(Activity activity) {
activity.startActivityForResult(new Intent(activity, SettingActivity.class), 1000);
@ -39,14 +40,12 @@ public class SettingActivity extends BaseActivity {
protected void initView() {
mBinding.home.setText(ApiConfig.get().getHome().getName());
mBinding.url.setText(Prefers.getUrl());
mAdapter = new SiteAdapter();
}
@Override
protected void initEvent() {
mBinding.config.setOnClickListener(this::showConfig);
mBinding.site.setOnClickListener(this::showSite);
mAdapter.setOnItemClickListener(this::onSiteClick);
}
private void showConfig(View view) {
@ -85,18 +84,22 @@ public class SettingActivity extends BaseActivity {
if (ApiConfig.get().getSites().isEmpty()) return;
int position = ApiConfig.get().getSites().indexOf(ApiConfig.get().getHome());
DialogSiteBinding bindingDialog = DialogSiteBinding.inflate(LayoutInflater.from(this));
bindingDialog.site.setLayoutManager(new LinearLayoutManager(this));
bindingDialog.site.getItemAnimator().setChangeDuration(0);
bindingDialog.site.setHasFixedSize(true);
bindingDialog.site.setAdapter(mAdapter);
mAdapter.addAll(ApiConfig.get().getSites());
bindingDialog.site.scrollToPosition(position);
SitePresenter presenter = new SitePresenter();
ArrayObjectAdapter adapter = new ArrayObjectAdapter(presenter);
adapter.addAll(0, ApiConfig.get().getSites());
presenter.setOnClickListener(item -> setSite(adapter, item));
bindingDialog.recycler.setVerticalSpacing(ResUtil.dp2px(16));
bindingDialog.recycler.setAdapter(new ItemBridgeAdapter(adapter));
bindingDialog.recycler.scrollToPosition(position);
Notify.show(this, bindingDialog.getRoot());
}
public void onSiteClick(Site item) {
public void setSite(ArrayObjectAdapter adapter, Site item) {
for (int i = 0; i < adapter.size(); i++) ((Site) adapter.get(i)).setActivated(item);
adapter.notifyArrayItemRangeChanged(0, adapter.size());
mBinding.home.setText(item.getName());
ApiConfig.get().setHome(item);
setResult(RESULT_OK);
Notify.dismiss();
}
}

@ -7,6 +7,9 @@ import android.view.ViewGroup;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentManager;
import androidx.fragment.app.FragmentStatePagerAdapter;
import androidx.leanback.widget.ArrayObjectAdapter;
import androidx.leanback.widget.ItemBridgeAdapter;
import androidx.leanback.widget.OnChildViewHolderSelectedListener;
@ -16,7 +19,7 @@ import androidx.viewpager.widget.ViewPager;
import com.fongmi.bear.bean.Result;
import com.fongmi.bear.databinding.ActivityVodBinding;
import com.fongmi.bear.ui.adapter.PageAdapter;
import com.fongmi.bear.ui.fragment.VodFragment;
import com.fongmi.bear.ui.presenter.TypePresenter;
import com.fongmi.bear.utils.ResUtil;
@ -72,14 +75,31 @@ public class VodActivity extends BaseActivity {
private void setRecyclerView() {
mBinding.recycler.setHorizontalSpacing(ResUtil.dp2px(16));
mBinding.recycler.setRowHeight(ViewGroup.LayoutParams.WRAP_CONTENT);
ArrayObjectAdapter arrayObjectAdapter = new ArrayObjectAdapter(mTypePresenter = new TypePresenter());
arrayObjectAdapter.addAll(0, mResult.getTypes());
ItemBridgeAdapter adapter = new ItemBridgeAdapter(arrayObjectAdapter);
mBinding.recycler.setAdapter(adapter);
ArrayObjectAdapter adapter = new ArrayObjectAdapter(mTypePresenter = new TypePresenter());
adapter.addAll(0, mResult.getTypes());
mBinding.recycler.setAdapter(new ItemBridgeAdapter(adapter));
}
private void setPager() {
mBinding.pager.setAdapter(new PageAdapter(getSupportFragmentManager(), mResult));
mBinding.pager.setAdapter(new PageAdapter(getSupportFragmentManager()));
if (mResult.getTypes().size() > 0) mBinding.pager.setOffscreenPageLimit(mResult.getTypes().size());
}
class PageAdapter extends FragmentStatePagerAdapter {
public PageAdapter(@NonNull FragmentManager fm) {
super(fm, BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT);
}
@NonNull
@Override
public Fragment getItem(int position) {
return VodFragment.newInstance(mResult.getTypes().get(position).getTypeId(), mResult.getFilters().get(mResult.getTypes().get(position).getTypeId()));
}
@Override
public int getCount() {
return mResult.getTypes().size();
}
}
}

@ -1,30 +0,0 @@
package com.fongmi.bear.ui.adapter;
import androidx.annotation.NonNull;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentManager;
import androidx.fragment.app.FragmentStatePagerAdapter;
import com.fongmi.bear.bean.Result;
import com.fongmi.bear.ui.fragment.VodFragment;
public class PageAdapter extends FragmentStatePagerAdapter {
private final Result result;
public PageAdapter(@NonNull FragmentManager fm, Result result) {
super(fm, BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT);
this.result = result;
}
@NonNull
@Override
public Fragment getItem(int position) {
return VodFragment.newInstance(result.getTypes().get(position).getTypeId(), result.getFilters().get(result.getTypes().get(position).getTypeId()));
}
@Override
public int getCount() {
return result.getTypes().size();
}
}

@ -1,81 +0,0 @@
package com.fongmi.bear.ui.adapter;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
import com.fongmi.bear.bean.Site;
import com.fongmi.bear.databinding.AdapterSiteBinding;
import java.util.ArrayList;
import java.util.List;
public class SiteAdapter extends RecyclerView.Adapter<SiteAdapter.ViewHolder> {
private OnItemClickListener mListener;
private List<Site> mItems;
public SiteAdapter() {
mItems = new ArrayList<>();
}
public interface OnItemClickListener {
void onItemClick(Site item);
}
public void setOnItemClickListener(OnItemClickListener listener) {
this.mListener = listener;
}
class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
private final AdapterSiteBinding binding;
public ViewHolder(@NonNull AdapterSiteBinding binding) {
super(binding.getRoot());
this.binding = binding;
itemView.setOnClickListener(this);
}
@Override
public void onClick(View view) {
Site item = mItems.get(getLayoutPosition());
setHome(getLayoutPosition());
mListener.onItemClick(item);
}
}
private void setHome(int position) {
for (int i = 0; i < mItems.size(); i++) mItems.get(i).setHome(i == position);
notifyItemRangeChanged(0, mItems.size());
}
public void addAll(List<Site> items) {
mItems.clear();
mItems.addAll(items);
notifyDataSetChanged();
}
@Override
public int getItemCount() {
return mItems.size();
}
@NonNull
@Override
public SiteAdapter.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
return new ViewHolder(AdapterSiteBinding.inflate(LayoutInflater.from(parent.getContext()), parent, false));
}
@Override
public void onBindViewHolder(@NonNull SiteAdapter.ViewHolder holder, int position) {
Site item = mItems.get(position);
holder.itemView.setSelected(item.isHome());
holder.binding.name.setText(item.getName());
if (item.isHome()) holder.itemView.requestFocus();
else holder.itemView.clearFocus();
}
}

@ -79,10 +79,9 @@ public class VodFragment extends Fragment implements Scroller.Callback {
selector.addPresenter(String.class, new ProgressPresenter());
selector.addPresenter(ListRow.class, new CustomRowPresenter(16), VodPresenter.class);
selector.addPresenter(ListRow.class, new CustomRowPresenter(8), FilterPresenter.class);
ItemBridgeAdapter adapter = new ItemBridgeAdapter(mAdapter = new ArrayObjectAdapter(selector));
mBinding.recycler.addOnScrollListener(mScroller = new Scroller(this));
mBinding.recycler.setVerticalSpacing(ResUtil.dp2px(16));
mBinding.recycler.setAdapter(adapter);
mBinding.recycler.setAdapter(new ItemBridgeAdapter(mAdapter = new ArrayObjectAdapter(selector)));
}
private void setViewModel() {

@ -0,0 +1,51 @@
package com.fongmi.bear.ui.presenter;
import android.view.LayoutInflater;
import android.view.ViewGroup;
import androidx.annotation.NonNull;
import androidx.leanback.widget.Presenter;
import com.fongmi.bear.bean.Site;
import com.fongmi.bear.databinding.AdapterSiteBinding;
public class SitePresenter extends Presenter {
private OnClickListener mListener;
public interface OnClickListener {
void onItemClick(Site item);
}
public void setOnClickListener(OnClickListener listener) {
this.mListener = listener;
}
@Override
public Presenter.ViewHolder onCreateViewHolder(ViewGroup parent) {
return new ViewHolder(AdapterSiteBinding.inflate(LayoutInflater.from(parent.getContext()), parent, false));
}
@Override
public void onBindViewHolder(Presenter.ViewHolder viewHolder, Object object) {
Site item = (Site) object;
ViewHolder holder = (ViewHolder) viewHolder;
holder.view.setActivated(item.isHome());
holder.binding.name.setText(item.getName());
setOnClickListener(holder, view -> mListener.onItemClick(item));
}
@Override
public void onUnbindViewHolder(Presenter.ViewHolder viewHolder) {
}
public static class ViewHolder extends Presenter.ViewHolder {
private final AdapterSiteBinding binding;
public ViewHolder(@NonNull AdapterSiteBinding binding) {
super(binding.getRoot());
this.binding = binding;
}
}
}

@ -18,8 +18,8 @@ import com.google.android.material.dialog.MaterialAlertDialogBuilder;
public class Notify {
private AlertDialog mDialog;
private Toast mToast;
private AlertDialog mProgress;
private static class Loader {
static volatile Notify INSTANCE = new Notify();
@ -38,13 +38,13 @@ public class Notify {
}
public static void show(Context context, View view) {
AlertDialog dialog = new MaterialAlertDialogBuilder(context).setView(view).create();
dialog.getWindow().setDimAmount(0);
get().mDialog = new MaterialAlertDialogBuilder(context).setView(view).create();
get().mDialog.getWindow().setDimAmount(0);
DisplayMetrics metrics = ResUtil.getDisplayMetrics();
WindowManager.LayoutParams params = dialog.getWindow().getAttributes();
params.width = (int) (metrics.widthPixels * 0.4f);
dialog.getWindow().setAttributes(params);
dialog.show();
WindowManager.LayoutParams params = get().mDialog.getWindow().getAttributes();
params.width = (int) (metrics.widthPixels * 0.3f);
get().mDialog.getWindow().setAttributes(params);
get().mDialog.show();
}
public static AlertDialog show(Context context, View view, DialogInterface.OnClickListener listener) {
@ -56,13 +56,13 @@ public class Notify {
public static void progress(Context context) {
ViewProgressBinding binding = ViewProgressBinding.inflate(LayoutInflater.from(context));
get().mProgress = new MaterialAlertDialogBuilder(context).setView(binding.getRoot()).create();
get().mProgress.getWindow().setBackgroundDrawableResource(android.R.color.transparent);
get().mProgress.show();
get().mDialog = new MaterialAlertDialogBuilder(context).setView(binding.getRoot()).create();
get().mDialog.getWindow().setBackgroundDrawableResource(android.R.color.transparent);
get().mDialog.show();
}
public static void dismiss() {
if (get().mProgress != null && get().mProgress.isShowing()) get().mProgress.dismiss();
if (get().mDialog != null && get().mDialog.isShowing()) get().mDialog.dismiss();
}
private void makeText(String message) {

@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@drawable/shape_site_focused" android:state_focused="true" />
<item android:drawable="@drawable/shape_site_selected" android:state_selected="true" />
<item android:drawable="@drawable/shape_site_selected" android:state_activated="true" />
<item android:drawable="@drawable/shape_site_normal" />
</selector>

@ -1,22 +1,14 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/name"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="6dp"
android:layout_marginBottom="6dp"
android:background="@drawable/selector_site"
android:focusable="true"
android:focusableInTouchMode="true">
<TextView
android:id="@+id/name"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:singleLine="true"
android:textColor="@color/white"
android:textSize="18sp"
tools:text="泥巴影院" />
</LinearLayout>
android:focusableInTouchMode="true"
android:gravity="center"
android:singleLine="true"
android:textColor="@color/white"
android:textSize="18sp"
tools:text="泥巴影院" />

@ -1,14 +1,8 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
<androidx.leanback.widget.VerticalGridView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/recycler"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:padding="16dp">
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/site"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:overScrollMode="never" />
</LinearLayout>
android:clipChildren="false"
android:clipToPadding="false"
android:padding="16dp" />
Loading…
Cancel
Save