Support vod load more

pull/2/head
FongMi 3 years ago
parent 0f49438988
commit f902612714
  1. 6
      app/src/main/java/com/fongmi/bear/bean/Result.java
  2. 55
      app/src/main/java/com/fongmi/bear/ui/custom/Scroller.java
  3. 16
      app/src/main/java/com/fongmi/bear/ui/fragment/VodFragment.java
  4. 32
      app/src/main/java/com/fongmi/bear/ui/presenter/ProgressPresenter.java
  5. 14
      app/src/main/res/layout/adapter_progress.xml

@ -20,6 +20,8 @@ import java.util.List;
public class Result {
@SerializedName("page")
private String page;
@SerializedName("class")
private List<Class> types;
@SerializedName("list")
@ -39,6 +41,10 @@ public class Result {
}
}
public String getPage() {
return page;
}
public List<Class> getTypes() {
return types == null ? Collections.emptyList() : types;
}

@ -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);
}
}

@ -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<String, String> mExtend;
private FragmentVodBinding mBinding;
private SiteViewModel mSiteViewModel;
private ArrayObjectAdapter mAdapter;
private List<Filter> 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<Vod> 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);
}
}

@ -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());
}
}
}

@ -0,0 +1,14 @@
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:padding="16dp">
<include
layout="@layout/view_progress"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center" />
</FrameLayout>
Loading…
Cancel
Save