CymChad / BaseRecyclerViewAdapterHelper

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

使用添加头,拖动到底了都不触发加载更多,快速滑动通过惯性可以触发 #2601

Closed qianshengta closed 5 years ago

qianshengta commented 5 years ago

当前版本是2.9.40 问题是我在使用GridLayoutManager布局的时候出现的问题。普通的线性布局不会。 就是当我获得第一页数据后,我手指一直按着屏幕拖动界面到底部了,都还没有触发加载更多的回调(注:这里我调用了storeAdapter.loadMoreComplete(),没有调用storeAdapter.loadMoreEnd())。 但是当我刚进入页面,快速大幅度滑动,手指离开屏幕,后面的距离靠惯性滑动,却是能够触发加载更多的 这里还有一个特殊情况,就是当我进入页面,手指按住拖动到最后,这样如上第一种情况是不会触发加载更多的。但是这样操作之后我再去快速滑动依靠惯性滑动如尚第二种情况,也不会再去触发加载更多了, 只有第一次进入界面就用第二种方法才能出发加载更多(注:这里我调storeAdapter.loadMoreComplete(),依然没有调用storeAdapter.loadMoreEnd())。

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

    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="@dimen/title_height"
        android:background="@color/colorBlue">

        <ImageView
            android:id="@+id/store_iv_back"
            style="@style/CommonBack"/>

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_centerInParent="true"
            android:text="商城"
            android:textColor="@color/colorWhite"
            android:textSize="@dimen/text_size_h4"/>

    </RelativeLayout>

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

        <android.support.v7.widget.RecyclerView
            android:id="@+id/store_rv_commodity"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:background="@color/colorWhite"
            android:overScrollMode="never"
            android:scrollbars="none">

        </android.support.v7.widget.RecyclerView>
    </android.support.v4.widget.SwipeRefreshLayout>

</LinearLayout>

以上是我主布局

<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="@color/colorWhite"
    android:orientation="horizontal"
    android:paddingBottom="10dp">

    <View
        android:id="@+id/item_view_left_15"
        android:layout_width="15dp"
        android:layout_height="match_parent"/>

    <View
        android:id="@+id/item_view_left_5"
        android:layout_width="5dp"
        android:layout_height="match_parent"/>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical">

        <ImageView
            android:id="@+id/item_cargo_iv_img"
            android:layout_width="160dp"
            android:layout_height="140dp"
            android:background="@drawable/bg_white_stroke_gray"
            android:padding="1dp"
            android:scaleType="fitXY"/>

        <TextView
            android:id="@+id/item_cargo_tv_name"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginTop="5dp"
            android:text=""
            android:textColor="@color/textBlackDeep"
            android:textSize="@dimen/text_size_H6"/>

        <TextView
            android:id="@+id/item_cargo_tv_score"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text=""
            android:textColor="@color/colorOrange"
            android:textSize="@dimen/text_size_h6"/>
    </LinearLayout>

    <View
        android:id="@+id/item_view_right_15"
        android:layout_width="15dp"
        android:layout_height="match_parent"/>

    <View
        android:id="@+id/item_view_right_5"
        android:layout_width="5dp"
        android:layout_height="match_parent"/>
</LinearLayout>

以上是我item的布局

<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@color/colorBackGround"
    android:orientation="vertical">

    <ImageView
        android:id="@+id/head_store_banner"
        android:layout_width="match_parent"
        android:layout_height="120dp"
        android:scaleType="fitXY"
        android:src="@mipmap/ic_store_head"
        >

    </ImageView>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="45dp"
        android:background="@color/colorWhite"
        android:orientation="horizontal">

        <LinearLayout
            android:id="@+id/head_store_ll_currency"
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_weight="1"
            android:gravity="center"
            android:orientation="horizontal">

            <ImageView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:src="@mipmap/ic_store_currency"/>

            <TextView
                android:id="@+id/head_store_tv_currency"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="资源币"
                android:textColor="@color/textBlack"
                android:textSize="@dimen/text_size_h6"/>

        </LinearLayout>

        <View
            android:layout_width="1dp"
            android:layout_height="match_parent"
            android:background="@color/colorGrayStroke"/>

        <LinearLayout
            android:id="@+id/head_store_ll_record"
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_weight="1"
            android:gravity="center"
            android:orientation="horizontal">

            <ImageView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:src="@mipmap/ic_store_record"/>

            <TextView
                android:id="@+id/head_store_tv_record"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="兑换记录"
                android:textColor="@color/textBlack"
                android:textSize="@dimen/text_size_h6"/>
        </LinearLayout>
    </LinearLayout>

    <View
        android:layout_width="match_parent"
        android:layout_height="1dp"
        android:layout_marginBottom="10dp"
        android:background="@color/colorGrayStroke"/>

    <View
        android:layout_width="match_parent"
        android:layout_height="1dp"
        android:background="@color/colorGrayStroke"/>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="45dp"
        android:background="@color/colorWhite"
        android:gravity="center_vertical">

        <ImageView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginLeft="10dp"
            android:src="@mipmap/ic_store_choiceness"/>

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginLeft="5dp"
            android:text="精品推荐"
            android:textColor="@color/textBlackDeep"
            android:textSize="@dimen/text_size_H6"/>

    </LinearLayout>

</LinearLayout>

以上是我添加的Head头布局

以下是我的使用方式

public void initParam() { storeAdapter = new StoreAdapter(baseActivity, R.layout.item_store, list); storeRvCommodity.setLayoutManager(new GridLayoutManager(baseActivity, 2)); storeAdapter.bindToRecyclerView(storeRvCommodity);//等同于recyclerView.setAdapter() storeAdapter.openLoadAnimation();//开启动画 storeAdapter.isFirstOnly(true);//动画是否只执行一次 storeAdapter.setNotDoAnimationCount(10);//设置不显示动画数量 storeAdapter.setOnItemClickListener(new BaseQuickAdapter.OnItemClickListener() { @Override public void onItemClick(BaseQuickAdapter adapter, View view, int position) { ProductList productList = list.get(position); start(CommodityDetailsFragment.newInstance(productList.getId())); } }); // 滑动最后一个Item的时候回调onLoadMoreRequested方法 storeAdapter.setOnLoadMoreListener(new BaseQuickAdapter.RequestLoadMoreListener() { @Override public void onLoadMoreRequested() { //在加载第一页数据后去加载更多,注,加载第一页数据和加载更多是两个接口 presenter.loadMoreProduct(); } }); //默认第一次加载会进入回调,如果不需要可以配置: storeAdapter.disableLoadMoreIfNotFullPage(); //预加载,当列表滑动到倒数第N个Item的时候(默认是1)回调onLoadMoreRequested方法 storeAdapter.setPreLoadNumber(2); initHeaderAndFooter(); //在加载第一页数据,注,加载第一页数据和加载更多是两个接口 presenter.listProductFirstScreen(false); }

private void initHeaderAndFooter() {
    LayoutInflater layoutInflater = (LayoutInflater) baseActivity.getSystemService(Context
            .LAYOUT_INFLATER_SERVICE);
    View headView = layoutInflater.inflate(R.layout.head_store, null);
    storeAdapter.addHeaderView(headView);//添加头布局
    headStore = new HeadStore(headView, baseActivity);
}

/**

qianshengta commented 5 years ago

我找到了问题所在,但是因为没有深入去了解,所以也不清楚具体的问题在哪。 我在获取到数据去更新数据时。之前页面因为使用了加载动画,在每次加载更多时都会显示动画,造成屏幕闪烁,所以我更新数据时用的是notifyDataSetChanged。之前我在其他地方用的一直都是线性LinearLayoutManager,一直都没用问题的,但是就是这次使用了GridLayoutManager后导致拖动无法触发记载更多(注:在使用方法上除了LinearLayoutManager、GridLayoutManager的不同外,其他都是一模一样的拷贝过去的)。现在GridLayoutManager我将notifyDataSetChanged换成了setNewData(),加载更多就能正常触发了。

qianshengta commented 5 years ago

好像又不是GridLayoutManager的问题,我其他代码都不懂,将GridLayoutManager改成LinearLayoutManager依然还是存在这个问题。我在对比下其他正常的代码,看看哪里有不同的

qianshengta commented 5 years ago

定位问题所在了,是因为添加头的问题。

  private void initHeaderAndFooter() {
        LayoutInflater layoutInflater = (LayoutInflater) baseActivity.getSystemService(Context
                .LAYOUT_INFLATER_SERVICE);
        View headView = layoutInflater.inflate(R.layout.head_store, null);
        storeAdapter.addHeaderView(headView);//添加头布局
        headStore = new HeadStore(headView, baseActivity);
    }

这是我添加头的方法,其他方法都不变,有无添加头造成我上门所说问题所在,添加头后,默认就不会开启加载更多,而setNewData方法里就有开启加载更多的方法,具体的原因还不知道。

qianshengta commented 5 years ago

????@AllenCoder

qianshengta commented 5 years ago

我即是调用了storeAdapter.setEnableLoadMore(true);也是没有用的@AllenCoder

qianshengta commented 5 years ago

在添加头之后 storeAdapter.setEnableLoadMore(true);打开是可以的,在添加头之前都是无效的。这说么在添加头后就去关闭了加载更多。是我的使用方法错误了吗?我看官网里的添加头中没有这方面的说明?@AllenCoder