[CymChad/BaseRecyclerViewAdapterHelper]StaggeredGridLayoutManager 一次上拉,触发多次RequestLoadMoreListener

2024-08-20 232 views
5

当前使用版本 compile 'com.github.CymChad:BaseRecyclerViewAdapterHelper:2.9.34' 使用StaggeredGridLayoutManager 后出现上拉一次,触发多次RequestLoadMoreListener 具体初始化代码如下

getRecyclerView().setLayoutManager(new StaggeredGridLayoutManager(4,StaggeredGridLayoutManager.VERTICAL));
        mAdapter = getAdapter();
        mAdapter.setEnableLoadMore(true);
        getRecyclerView().setAdapter(mAdapter);
        mAdapter.setOnLoadMoreListener(new BaseQuickAdapter.RequestLoadMoreListener() {
            @Override
            public void onLoadMoreRequested() {
                loadMore();
            }
        }, getRecyclerView());
        mAdapter.setLoadMoreView(new RvLoadMoreView());

回答

6

下面是加载更多数据实现:

 final List<Integer> list = new ArrayList<>();
        for (int i = 0; i < 10; i++)
            list.add(i);
        Observable.create(new ObservableOnSubscribe<List<Integer>>() {
            @Override
            public void subscribe(ObservableEmitter<List<Integer>> observableEmitter) throws Exception {
                Random random = new Random();
                if (random.nextBoolean())
                    observableEmitter.onNext(list);
                else
                    observableEmitter.onError(new Throwable("load failed"));
            }
        })
                .subscribeOn(Schedulers.io())
                .delay(1000, TimeUnit.MILLISECONDS)
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(new Consumer<List<Integer>>() {
                    @Override
                    public void accept(List<Integer> integer) throws Exception {
                        mView.updateData(integer);
                        mView.showLoadComplete();
                    }
                }, new Consumer<Throwable>() {
                    @Override
                    public void accept(Throwable throwable) throws Exception {
                        throwable.printStackTrace();
                        mView.showLoadError();
                    }
                });

以下是加载结束,加载完成,加载失败回调处理:

@Override
    public void showLoadComplete() {
        mAdapter.loadMoreComplete();
    }

    @Override
    public void showLoadError() {
        mAdapter.loadMoreFail();
    }

    @Override
    public void showLoadEnd() {
        mAdapter.loadMoreEnd();
    }

数据更新:

 @Override
    public void updateData(List<?> list) {
        mAdapter.addData(list);
    }
9

@RahulSDeshpande hi this is my layout file <?xml version="1.0" encoding="utf-8"?>

<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <com.telemedicine_tv.widget.ScaleRecyclerView
        android:id="@+id/rv_doctors"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>
</LinearLayout>

and this is my custom widget code:

public class ScaleRecyclerView extends RecyclerView {

    private int mSelectedPosition = 0;

    public ScaleRecyclerView(Context context) {
        super(context);
        init();
    }

    public ScaleRecyclerView(Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
        init();
    }

    public ScaleRecyclerView(Context context, @Nullable AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        init();
    }

    private void init() {
        //启用子视图排序功能
        setChildrenDrawingOrderEnabled(true);
    }

    @Override
    public void onDraw(Canvas c) {
        mSelectedPosition = getChildAdapterPosition(getFocusedChild());
        super.onDraw(c);
    }

    @Override
    protected int getChildDrawingOrder(int childCount, int i) {
        int position = mSelectedPosition;
        if (position < 0) {
            return i;
        } else {
            if (i == childCount - 1) {
                if (position > i) {
                    position = i;
                }
                return position;
            }
            if (i == position) {
                return childCount - 1;
            }
        }
        return i;
    }
}

emm .. I don't use NestedScrollViewanywhere. Any problem with my custom RecyclerView?

7

adapter.addData后及时调用adapter.loadMoreComplete;

9

@ck-snow 你好。我在addData后马上调用了loadMoreComplete,我贴出来的代码就是这样写的啊

1

是这样的,我觉得这个可能是baserecyclerviewadapterhelper的bug,当屏幕中最后可见的item是数据data的最后一条时,就会触发onLoadMoreRequested方法。上拉加载更多的footer占据屏幕的空间,当加载完成后,footer会隐藏,这时adapter发现最后一个可见的item还是数据data的最后一条,又触发了onLoadMoreRequested。 解决办法:增大item的高度

4

@ck-snow 你好,现在的情况是:当最后可见的item不是data的最后一条时还是会触发onLoadMoreRequested。

6

//加载更多 adapter.setOnLoadMoreListener({ val lastVisibleItem = gridLayoutManager.findLastVisibleItemPosition() if (lastVisibleItem == adapter.itemCount - 1 && adapter.itemCount < gallery.size) { worker.getPhotos(virginLoad,date) } },recycleView) 我也出现了相同的情况,一打开界面,根本没有滑动和上拉,最后一个item也不可见,就一直在自动回调往前加载数据,直到没有数据可供加载才停下,我这里分明设置的是滑动到底部,最后一个item可见时才加载更多,用的是android.support.v7.widget.RecyclerView 和 NestedScrollView

2

是这样的,在回调函数里加一个判断recyclerView是否滚动到底部的判断就能发现,第一次滚动到底部触发加载后,接下来判断函数将不断判定滚动到底部,因而回调函数将不断加载,直到所有加载内容结束。另外在这个过程中检测itemcount好像也始终保持最开始的个数。。。

xml文件是最普通的recyclerView。

2

@wmgylc 问题是我一进入就开始加载啊,并没有滚动操作,滑动到底部,最后一个item并不可见,itemCount 并没有保持不变是,加载一次就改变值的,我知道问题出在哪里了,val lastVisibleItem = gridLayoutManager.findLastVisibleItemPosition(),或者findLastCompletelyVisibleItemPosition,这里的lastVisibleItemPosition()每次拿到的都是集合的最后一个位置的数据,而不是可见的最后一个位置,不知道怎么回事。 官方说的是 // 滑动最后一个Item的时候回调onLoadMoreRequested方法 setOnLoadMoreListener(RequestLoadMoreListener) 就是说我只需要在回调里写获取数据的方法,自己会监听是否滑动到底部,然而并没有,

@ShshyDevooo 老兄你解决了么

8

@caineyang 我也还没解决呢

9

@caineyang 加载更多不能和NestedScrollView嵌套使用

2

@ShshyDevooo 最好提供个demo 不知道你说的一次上拉,触发多次RequestLoadMoreListener是怎么回事。addData后如果不调用loadMoreComplete是不会回调RequestLoadMoreListener的。RequestLoadMoreListener回调是在LoadMoreView将要显示的时候回调的,就是在屏幕内或将要进入屏幕内。

3

@1109993488 addData后肯定必须调用loadMoreComplet啊,老哥。所以会一直加载么,我必须用NestedScrollView啊,使用了CollapsingToolbarLayout,和toolbar,有交互有没有什么替代???文档里也没有写不能用,用recycleview也用NestedScrollView,情况挺多的啊

5

@caineyang 和CollapsingToolbarLayout一起使用不一定非要用NestedScrollViewRecyclerView直接和CollapsingToolbarLayout是没有问题的,如果还有别的布局你可以加到RecyclerView的头部。NestedScrollViewRecyclerView嵌套使用是有问题的

8

@1109993488 放弃使用NestedScrollView了,可以用了 谢谢老铁