diff --git a/app/src/main/java/com/fongmi/bear/bean/Result.java b/app/src/main/java/com/fongmi/bear/bean/Result.java index b24c02b09..d318e23d9 100644 --- a/app/src/main/java/com/fongmi/bear/bean/Result.java +++ b/app/src/main/java/com/fongmi/bear/bean/Result.java @@ -20,6 +20,8 @@ import java.util.List; public class Result { + @SerializedName("page") + private String page; @SerializedName("class") private List types; @SerializedName("list") @@ -39,6 +41,10 @@ public class Result { } } + public String getPage() { + return page; + } + public List getTypes() { return types == null ? Collections.emptyList() : types; } diff --git a/app/src/main/java/com/fongmi/bear/ui/custom/Scroller.java b/app/src/main/java/com/fongmi/bear/ui/custom/Scroller.java new file mode 100644 index 000000000..309f7f044 --- /dev/null +++ b/app/src/main/java/com/fongmi/bear/ui/custom/Scroller.java @@ -0,0 +1,55 @@ +package com.fongmi.bear.ui.custom; + +import android.os.Handler; +import android.util.Log; +import android.view.View; + +import androidx.annotation.NonNull; +import androidx.recyclerview.widget.RecyclerView; + +public class Scroller extends RecyclerView.OnScrollListener { + + private final Callback callback; + private boolean loading; + private int page; + + public Scroller(Callback callback) { + this.callback = callback; + this.page = 1; + } + + @Override + public void onScrollStateChanged(@NonNull RecyclerView view, int newState) { + if (isLoading() || !isBottom(view) || newState != RecyclerView.SCROLL_STATE_IDLE) return; + setLoading(true); callback.onLoadMore(String.valueOf(++page)); + } + + private boolean isBottom(RecyclerView view) { + View lastChildView = view.getLayoutManager().getChildAt(view.getLayoutManager().getChildCount() - 1); + int lastChildBottom = lastChildView.getBottom(); + int recyclerBottom = view.getBottom() - view.getPaddingBottom(); + int lastPosition = view.getLayoutManager().getPosition(lastChildView); + return lastChildBottom == recyclerBottom && lastPosition == view.getLayoutManager().getItemCount() - 1; + } + + public void reset() { + page = 1; + } + + public boolean isLoading() { + return loading; + } + + private void setLoading(boolean loading) { + this.loading = loading; + } + + public void endLoading(boolean empty) { + new Handler().postDelayed(() -> setLoading(false), 1000); + if (empty) page--; + } + + public interface Callback { + void onLoadMore(String page); + } +} 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 0d922cede..d32e43508 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 @@ -19,7 +19,9 @@ import com.fongmi.bear.databinding.FragmentVodBinding; import com.fongmi.bear.model.SiteViewModel; import com.fongmi.bear.ui.custom.CustomRowPresenter; import com.fongmi.bear.ui.custom.CustomSelector; +import com.fongmi.bear.ui.custom.Scroller; import com.fongmi.bear.ui.presenter.FilterPresenter; +import com.fongmi.bear.ui.presenter.ProgressPresenter; import com.fongmi.bear.ui.presenter.VodPresenter; import com.fongmi.bear.utils.ResUtil; import com.google.common.collect.Lists; @@ -29,13 +31,14 @@ import java.util.HashMap; import java.util.List; import java.util.Objects; -public class VodFragment extends Fragment { +public class VodFragment extends Fragment implements Scroller.Callback { private HashMap mExtend; private FragmentVodBinding mBinding; private SiteViewModel mSiteViewModel; private ArrayObjectAdapter mAdapter; private List mFilters; + private Scroller mScroller; private String getTypeId() { return getArguments().getString("typeId"); @@ -73,9 +76,11 @@ public class VodFragment extends Fragment { private void setRecyclerView() { CustomSelector selector = new CustomSelector(); + 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); } @@ -83,6 +88,8 @@ public class VodFragment extends Fragment { private void setViewModel() { mSiteViewModel = new ViewModelProvider(this).get(SiteViewModel.class); mSiteViewModel.mResult.observe(getViewLifecycleOwner(), result -> { + mAdapter.remove("progress"); + mScroller.endLoading(result.getList().isEmpty()); for (List items : Lists.partition(result.getList(), 5)) { ArrayObjectAdapter adapter = new ArrayObjectAdapter(new VodPresenter()); adapter.addAll(0, items); @@ -110,6 +117,7 @@ public class VodFragment extends Fragment { } private void getContent() { + mScroller.reset(); getContent("1"); } @@ -118,4 +126,10 @@ public class VodFragment extends Fragment { if (clear) mAdapter.removeItems(mFilters.size(), mAdapter.size() - mFilters.size()); mSiteViewModel.categoryContent(getTypeId(), page, true, mExtend); } + + @Override + public void onLoadMore(String page) { + mAdapter.add("progress"); + getContent(page); + } } diff --git a/app/src/main/java/com/fongmi/bear/ui/presenter/ProgressPresenter.java b/app/src/main/java/com/fongmi/bear/ui/presenter/ProgressPresenter.java new file mode 100644 index 000000000..bfda78502 --- /dev/null +++ b/app/src/main/java/com/fongmi/bear/ui/presenter/ProgressPresenter.java @@ -0,0 +1,32 @@ +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.databinding.AdapterProgressBinding; + +public class ProgressPresenter extends Presenter { + + @Override + public Presenter.ViewHolder onCreateViewHolder(ViewGroup parent) { + return new ViewHolder(AdapterProgressBinding.inflate(LayoutInflater.from(parent.getContext()), parent, false)); + } + + @Override + public void onBindViewHolder(Presenter.ViewHolder viewHolder, Object object) { + } + + @Override + public void onUnbindViewHolder(Presenter.ViewHolder viewHolder) { + } + + public static class ViewHolder extends Presenter.ViewHolder { + + public ViewHolder(@NonNull AdapterProgressBinding binding) { + super(binding.getRoot()); + } + } +} \ No newline at end of file diff --git a/app/src/main/res/layout/adapter_progress.xml b/app/src/main/res/layout/adapter_progress.xml new file mode 100644 index 000000000..a58dd3545 --- /dev/null +++ b/app/src/main/res/layout/adapter_progress.xml @@ -0,0 +1,14 @@ + + + + + + \ No newline at end of file