From 94f39fdb493d3c655f3dedb72ebc4f498af0f6fd Mon Sep 17 00:00:00 2001 From: FongMi Date: Thu, 6 Oct 2022 11:00:39 +0800 Subject: [PATCH] Keep support delete --- .../android/tv/ui/activity/KeepActivity.java | 51 +++++------- .../KeepAdapter.java} | 80 ++++++++++++------- .../tv/ui/presenter/HistoryPresenter.java | 2 +- app/src/leanback/res/layout/activity_keep.xml | 9 +-- .../android/tv/ui/adapter/HistoryAdapter.java | 2 +- 5 files changed, 76 insertions(+), 68 deletions(-) rename app/src/leanback/java/com/fongmi/android/tv/ui/{presenter/KeepPresenter.java => adapter/KeepAdapter.java} (64%) diff --git a/app/src/leanback/java/com/fongmi/android/tv/ui/activity/KeepActivity.java b/app/src/leanback/java/com/fongmi/android/tv/ui/activity/KeepActivity.java index defdc3b77..ed420de4c 100644 --- a/app/src/leanback/java/com/fongmi/android/tv/ui/activity/KeepActivity.java +++ b/app/src/leanback/java/com/fongmi/android/tv/ui/activity/KeepActivity.java @@ -3,9 +3,7 @@ package com.fongmi.android.tv.ui.activity; import android.app.Activity; import android.content.Intent; -import androidx.leanback.widget.ArrayObjectAdapter; -import androidx.leanback.widget.ItemBridgeAdapter; -import androidx.leanback.widget.ListRow; +import androidx.recyclerview.widget.GridLayoutManager; import androidx.viewbinding.ViewBinding; import com.fongmi.android.tv.api.ApiConfig; @@ -14,24 +12,18 @@ import com.fongmi.android.tv.bean.Keep; import com.fongmi.android.tv.databinding.ActivityKeepBinding; import com.fongmi.android.tv.event.RefreshEvent; import com.fongmi.android.tv.net.Callback; -import com.fongmi.android.tv.ui.custom.CustomRowPresenter; -import com.fongmi.android.tv.ui.custom.CustomSelector; -import com.fongmi.android.tv.ui.presenter.KeepPresenter; +import com.fongmi.android.tv.ui.adapter.KeepAdapter; +import com.fongmi.android.tv.ui.custom.SpaceItemDecoration; import com.fongmi.android.tv.utils.Prefers; -import com.fongmi.android.tv.utils.ResUtil; -import com.google.common.collect.Lists; import org.greenrobot.eventbus.EventBus; import org.greenrobot.eventbus.Subscribe; import org.greenrobot.eventbus.ThreadMode; -import java.util.ArrayList; -import java.util.List; - -public class KeepActivity extends BaseActivity implements KeepPresenter.OnClickListener { +public class KeepActivity extends BaseActivity implements KeepAdapter.OnClickListener { private ActivityKeepBinding mBinding; - private ArrayObjectAdapter mAdapter; + private KeepAdapter mAdapter; public static void start(Activity activity) { activity.startActivity(new Intent(activity, KeepActivity.class)); @@ -50,21 +42,15 @@ public class KeepActivity extends BaseActivity implements KeepPresenter.OnClickL } private void setRecyclerView() { - CustomSelector selector = new CustomSelector(); - selector.addPresenter(ListRow.class, new CustomRowPresenter(16), KeepPresenter.class); - mBinding.recycler.setAdapter(new ItemBridgeAdapter(mAdapter = new ArrayObjectAdapter(selector))); - mBinding.recycler.setVerticalSpacing(ResUtil.dp2px(16)); - mBinding.recycler.setHeader(mBinding.toolbar); + mBinding.recycler.setHasFixedSize(true); + mBinding.recycler.setItemAnimator(null); + mBinding.recycler.setAdapter(mAdapter = new KeepAdapter(this)); + mBinding.recycler.setLayoutManager(new GridLayoutManager(this, Prefers.getColumn())); + mBinding.recycler.addItemDecoration(new SpaceItemDecoration(Prefers.getColumn(), 16)); } private void getKeep() { - List rows = new ArrayList<>(); - for (List part : Lists.partition(Keep.getAll(), Prefers.getColumn())) { - ArrayObjectAdapter adapter = new ArrayObjectAdapter(new KeepPresenter(this)); - adapter.setItems(part, null); - rows.add(new ListRow(adapter)); - } - mAdapter.addAll(0, rows); + mAdapter.addAll(Keep.getAll()); } private void loadConfig(Config config, Keep item) { @@ -87,10 +73,7 @@ public class KeepActivity extends BaseActivity implements KeepPresenter.OnClickL @Subscribe(threadMode = ThreadMode.MAIN) public void onRefreshEvent(RefreshEvent event) { - if (event.getType() == RefreshEvent.Type.KEEP) { - mAdapter.clear(); - getKeep(); - } + if (event.getType() == RefreshEvent.Type.KEEP) getKeep(); } @Override @@ -107,14 +90,22 @@ public class KeepActivity extends BaseActivity implements KeepPresenter.OnClickL @Override public void onItemDelete(Keep item) { - + mAdapter.delete(item); + if (mAdapter.getItemCount() == 0) mAdapter.setDelete(false); } @Override public boolean onLongClick() { + mAdapter.setDelete(true); return true; } + @Override + public void onBackPressed() { + if (mAdapter.isDelete()) mAdapter.setDelete(false); + else super.onBackPressed(); + } + @Override protected void onDestroy() { super.onDestroy(); diff --git a/app/src/leanback/java/com/fongmi/android/tv/ui/presenter/KeepPresenter.java b/app/src/leanback/java/com/fongmi/android/tv/ui/adapter/KeepAdapter.java similarity index 64% rename from app/src/leanback/java/com/fongmi/android/tv/ui/presenter/KeepPresenter.java rename to app/src/leanback/java/com/fongmi/android/tv/ui/adapter/KeepAdapter.java index 052c55fbd..5a395af02 100644 --- a/app/src/leanback/java/com/fongmi/android/tv/ui/presenter/KeepPresenter.java +++ b/app/src/leanback/java/com/fongmi/android/tv/ui/adapter/KeepAdapter.java @@ -1,11 +1,11 @@ -package com.fongmi.android.tv.ui.presenter; +package com.fongmi.android.tv.ui.adapter; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import androidx.annotation.NonNull; -import androidx.leanback.widget.Presenter; +import androidx.recyclerview.widget.RecyclerView; import com.bumptech.glide.Glide; import com.fongmi.android.tv.App; @@ -15,17 +15,29 @@ import com.fongmi.android.tv.databinding.AdapterVodBinding; import com.fongmi.android.tv.utils.Prefers; import com.fongmi.android.tv.utils.ResUtil; -public class KeepPresenter extends Presenter { +import java.util.ArrayList; +import java.util.List; + +public class KeepAdapter extends RecyclerView.Adapter { private final OnClickListener mListener; + private final List mItems; private int width, height; private boolean delete; - public KeepPresenter(OnClickListener listener) { + public KeepAdapter(OnClickListener listener) { + this.mItems = new ArrayList<>(); this.mListener = listener; setLayoutSize(); } + private void setLayoutSize() { + int space = ResUtil.dp2px(48) + ResUtil.dp2px(16 * (Prefers.getColumn() - 1)); + int base = ResUtil.getScreenWidthPx() - space; + width = base / Prefers.getColumn(); + height = (int) (width / 0.75f); + } + public interface OnClickListener { void onItemClick(Keep item); @@ -35,23 +47,46 @@ public class KeepPresenter extends Presenter { boolean onLongClick(); } + public static class ViewHolder extends RecyclerView.ViewHolder { + + private final AdapterVodBinding binding; + + public ViewHolder(@NonNull AdapterVodBinding binding) { + super(binding.getRoot()); + this.binding = binding; + } + } + + public void addAll(List items) { + mItems.clear(); + mItems.addAll(items); + notifyDataSetChanged(); + } + + public void delete(Keep item) { + int index = mItems.indexOf(item); + if (index == -1) return; + mItems.remove(index); + notifyItemRemoved(index); + } + public boolean isDelete() { return delete; } public void setDelete(boolean delete) { this.delete = delete; + notifyItemRangeChanged(0, mItems.size()); } - private void setLayoutSize() { - int space = ResUtil.dp2px(48) + ResUtil.dp2px(16 * (Prefers.getColumn() - 1)); - int base = ResUtil.getScreenWidthPx() - space; - width = base / Prefers.getColumn(); - height = (int) (width / 0.75f); + @Override + public int getItemCount() { + return mItems.size(); } + @NonNull @Override - public Presenter.ViewHolder onCreateViewHolder(ViewGroup parent) { + public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { ViewHolder holder = new ViewHolder(AdapterVodBinding.inflate(LayoutInflater.from(parent.getContext()), parent, false)); holder.binding.getRoot().getLayoutParams().width = width; holder.binding.getRoot().getLayoutParams().height = height; @@ -59,16 +94,15 @@ public class KeepPresenter extends Presenter { } @Override - public void onBindViewHolder(Presenter.ViewHolder viewHolder, Object object) { - Keep item = (Keep) object; - ViewHolder holder = (ViewHolder) viewHolder; - setClickListener(holder.view, item); + public void onBindViewHolder(@NonNull ViewHolder holder, int position) { + Keep item = mItems.get(position); + setClickListener(holder.itemView, item); holder.binding.name.setText(item.getVodName()); holder.binding.remark.setVisibility(View.GONE); holder.binding.site.setVisibility(View.VISIBLE); holder.binding.site.setText(item.getSiteName()); holder.binding.delete.setVisibility(!delete ? View.GONE : View.VISIBLE); - Glide.with(App.get()).load(item.getVodPic()).centerCrop().error(R.drawable.ic_img_error).placeholder(R.drawable.ic_img_loading).into(holder.binding.image); + Glide.with(App.get()).load(item.getVodPic()).error(R.drawable.ic_img_error).placeholder(R.drawable.ic_img_loading).into(holder.binding.image); } private void setClickListener(View root, Keep item) { @@ -78,18 +112,4 @@ public class KeepPresenter extends Presenter { else mListener.onItemClick(item); }); } - - @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; - } - } -} \ No newline at end of file +} diff --git a/app/src/leanback/java/com/fongmi/android/tv/ui/presenter/HistoryPresenter.java b/app/src/leanback/java/com/fongmi/android/tv/ui/presenter/HistoryPresenter.java index 8825985ae..141f9cb81 100644 --- a/app/src/leanback/java/com/fongmi/android/tv/ui/presenter/HistoryPresenter.java +++ b/app/src/leanback/java/com/fongmi/android/tv/ui/presenter/HistoryPresenter.java @@ -70,7 +70,7 @@ public class HistoryPresenter extends Presenter { holder.binding.remark.setText(ResUtil.getString(R.string.vod_last, item.getVodRemarks())); holder.binding.remark.setVisibility(delete ? View.GONE : View.VISIBLE); holder.binding.delete.setVisibility(!delete ? View.GONE : View.VISIBLE); - Glide.with(App.get()).load(item.getVodPic()).centerCrop().error(R.drawable.ic_img_error).placeholder(R.drawable.ic_img_loading).into(holder.binding.image); + Glide.with(App.get()).load(item.getVodPic()).error(R.drawable.ic_img_error).placeholder(R.drawable.ic_img_loading).into(holder.binding.image); } private void setClickListener(View root, History item) { diff --git a/app/src/leanback/res/layout/activity_keep.xml b/app/src/leanback/res/layout/activity_keep.xml index 25cbf5138..010a31ab0 100644 --- a/app/src/leanback/res/layout/activity_keep.xml +++ b/app/src/leanback/res/layout/activity_keep.xml @@ -1,6 +1,5 @@ - + android:paddingBottom="24dp" /> diff --git a/app/src/mobile/java/com/fongmi/android/tv/ui/adapter/HistoryAdapter.java b/app/src/mobile/java/com/fongmi/android/tv/ui/adapter/HistoryAdapter.java index b12b6931d..e638a6c81 100644 --- a/app/src/mobile/java/com/fongmi/android/tv/ui/adapter/HistoryAdapter.java +++ b/app/src/mobile/java/com/fongmi/android/tv/ui/adapter/HistoryAdapter.java @@ -81,6 +81,6 @@ public class HistoryAdapter extends RecyclerView.Adapter mListener.onItemClick(item)); holder.binding.getRoot().setOnLongClickListener(view -> mListener.onLongClick(item)); - Glide.with(App.get()).load(item.getVodPic()).centerCrop().error(R.drawable.ic_img_error).placeholder(R.drawable.ic_img_loading).into(holder.binding.image); + Glide.with(App.get()).load(item.getVodPic()).error(R.drawable.ic_img_error).placeholder(R.drawable.ic_img_loading).into(holder.binding.image); } }