CymChad / BaseRecyclerViewAdapterHelper

BRVAH:Powerful and flexible RecyclerAdapter
http://www.recyclerview.org/
MIT License
24.23k stars 5.15k forks source link

openLoadMore触发onLoadMoreRequested 问题. #307

Closed solomon2 closed 7 years ago

solomon2 commented 7 years ago

当我设置openLoadMore(size)小于或者等于 listdata.size 的时候就会报错

java.lang.IndexOutOfBoundsException: Invalid index 12, size is 12
at java.util.ArrayList.throwIndexOutOfBoundsException(ArrayList.java:255)
at java.util.ArrayList.get(ArrayList.java:308)
at com.chad.library.adapter.base.BaseQuickAdapter.onBindViewHolder(BaseQuickAdapter.java:549)
at android.support.v7.widget.RecyclerView$Adapter.onBindViewHolder(RecyclerView.java:5822)
at android.support.v7.widget.RecyclerView$Adapter.bindViewHolder(RecyclerView.java:5855)
at android.support.v7.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:5091)
at android.support.v7.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:4967)
at android.support.v7.widget.LinearLayoutManager$LayoutState.next(LinearLayoutManager.java:2029)
at android.support.v7.widget.LinearLayoutManager.layoutChunk(LinearLayoutManager.java:1414)
at android.support.v7.widget.LinearLayoutManager.fill(LinearLayoutManager.java:1377)
at android.support.v7.widget.LinearLayoutManager.scrollBy(LinearLayoutManager.java:1193)
at android.support.v7.widget.LinearLayoutManager.scrollVerticallyBy(LinearLayoutManager.java:1043)
at android.support.v7.widget.RecyclerView$ViewFlinger.run(RecyclerView.java:4413)
at android.view.Choreographer$CallbackRecord.run(Choreographer.java:761)
at android.view.Choreographer.doCallbacks(Choreographer.java:574)
at android.view.Choreographer.doFrame(Choreographer.java:543)
at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:747)
at android.os.Handler.handleCallback(Handler.java:733)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:136)
at android.app.ActivityThread.main(ActivityThread.java:5045)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:515)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)
at dalvik.system.NativeStart.main(Native Method)

设置size大于listdata.size就不会触发onLoadMoreRequested

solomon2 commented 7 years ago
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:id="@+id/layout"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <app.dinus.com.loadingdrawable.LoadingView
        android:id="@+id/loadingView"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_marginBottom="100dp"
        android:background="@color/white"
        app:loading_renderer="CollisionLoadingRenderer" />

    <android.support.v4.widget.SwipeRefreshLayout
        android:id="@+id/refreshLayout"
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <android.support.v7.widget.RecyclerView
            android:id="@+id/recyclerView"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:visibility="gone"/>
    </android.support.v4.widget.SwipeRefreshLayout>

</RelativeLayout>
solomon2 commented 7 years ago

RecyclerView监听了OnScrollListener

 recycler_view.setOnScrollListener(new RecyclerView.OnScrollListener() {
            @Override
            public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
                super.onScrollStateChanged(recyclerView, newState);
                int firstVisibleItem = linearLayoutManager.findFirstCompletelyVisibleItemPosition();
                if (newState == 0) {
                    if (null != recycler_view.getChildAt(0)) {
//                        if(recycler_view.getChildAt(0).getTop()>=0){
//                            mCurrentItem=firstVisibleItem;
//                        }else{
//                            mCurrentItem=firstVisibleItem+1;
//                        }
                        mCurrentItem = firstVisibleItem;
                        adapter.setCurrentItem(mCurrentItem);
                        adapter.notifyDataSetChanged();
                    }
                }
            }
            @Override
            public void onScrolled(RecyclerView recyclerView, int dx, int dy) { }
        });

Adapter里面重写了getItemViewType:

    public void setCurrentItem(int currentItem) {
        this.mCurrentItem = currentItem;
    }

    @Override
    public int getItemViewType(int position) {
        if (position == mCurrentItem) {
            return TYPE_2;
        } else {
            return TYPE_1;
        }
    }

其他没作什么改动

CymChad commented 7 years ago

重写了getItemViewType会出问题的。

solomon2 commented 7 years ago

啊, 那怎么破

solomon2 commented 7 years ago

我RecyclerView里面需要做分类处理,需要linearLayoutManager.findFirstCompletelyVisibleItemPosition(); 做特殊处理

CymChad commented 7 years ago

BRVAH 有专门的分类用法,https://github.com/CymChad/BaseRecyclerViewAdapterHelper/wiki/Use-it-custom-item-view-type

solomon2 commented 7 years ago

哦哦 知道了知道了,抱歉,多谢了,我马上试试。

CymChad commented 7 years ago

恩 好的