在嵌套滚动android内部无限加载更多recyclerview

时间:2016-12-06 07:34:08

标签: android infinite-scroll nestedscrollview endlessscroll

我在nestedscrollview中有Recyclerview,我想将nestedscrollview滚动到buttom显示加载并将更多列表加载到recyclerview。

这是我的xml。

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/activity_main"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="kh.com.iknow.endless.MainActivity">

    <android.support.v4.widget.NestedScrollView
        android:layout_width="match_parent"
        android:layout_height="wrap_content">
        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="vertical">
            <LinearLayout
                android:layout_width="match_parent"
                android:layout_height="wrap_content">
                <Button
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:layout_weight="1"
                    android:text="Filter"/>
                <Button
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:layout_weight="1"
                    android:text="Sort"/>
            </LinearLayout>
            <android.support.v7.widget.RecyclerView
                android:id="@+id/recycler_view"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:clipToPadding="false"
                android:scrollbars="vertical" />
        </LinearLayout>
    </android.support.v4.widget.NestedScrollView>
</LinearLayout>

2 个答案:

答案 0 :(得分:3)

你可以用两种方式做到:

1-将标题添加到recyclerview

2-使用NestedScrolview的setOnScrollChangeListener方法

我更喜欢第二种方式:

 NestedScrollView nestedSV = (NestedScrollView)      findViewById(R.id.nested_sync_scrollview);

 if (nestedSV != null) {

        nestedSV.setOnScrollChangeListener(new NestedScrollView.OnScrollChangeListener() {
            @Override
            public void onScrollChange(NestedScrollView v, int scrollX, int scrollY, int oldScrollX, int oldScrollY) {
                String TAG = "nested_sync";
                if (scrollY > oldScrollY) {
                    Log.i(TAG, "Scroll DOWN");
                }
                if (scrollY < oldScrollY) {
                    Log.i(TAG, "Scroll UP");
                }

                if (scrollY == 0) {
                    Log.i(TAG, "TOP SCROLL");
                }

                if (scrollY == (v.getChildAt(0).getMeasuredHeight() - v.getMeasuredHeight())) {
                    Log.i(TAG, "BOTTOM SCROLL");
                    if (!isRecyclerViewWaitingtoLaadData) //check for scroll down
                    {

                        if (!loadedAllItems) {
                            showUnSentData();
                        }
                    }
                }
            }
        });
    }

答案 1 :(得分:0)

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@color/off_white_bg"
    android:orientation="vertical">

    <FrameLayout
        android:id="@+id/container"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_marginTop="2dp"
        android:fitsSystemWindows="true">

        <android.support.v4.widget.NestedScrollView
            android:id="@+id/nestedScrollViewId"
            android:layout_width="match_parent"
            android:layout_height="fill_parent"
            android:fillViewport="true">

            <LinearLayout
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:focusableInTouchMode="true"
                android:orientation="vertical"
                app:layout_scrollFlags="scroll|enterAlways">

                <LinearLayout
                    android:id="@+id/permiumLAyout"
                    android:layout_width="match_parent"
                    android:layout_height="match_parent"
                    android:layout_below="@+id/divider"
                    android:layout_centerHorizontal="true"
                    android:layout_marginTop="10dp"
                    android:focusableInTouchMode="true"
                    android:gravity="center"
                    android:orientation="vertical"
                    android:visibility="visible">
                    <!--  List view -->

                    <LinearLayout
                        android:layout_width="match_parent"
                        android:layout_height="wrap_content"
                        android:background="@color/btn_br_color"
                        android:padding="3dp">

                        <TextView
                            android:id="@+id/primiumGameNameText"
                            android:layout_width="wrap_content"
                            android:layout_height="wrap_content"
                            android:layout_gravity="fill"
                            android:layout_marginLeft="15dp"
                            android:gravity="center"
                            android:maxLines="4"
                            android:text="Primium Games"
                            android:textAppearance="@style/TextAppearance.AppCompat.Body1"
                            android:textColor="@color/row_text_color"
                            android:textSize="18sp"
                            android:textStyle="bold" />

                    </LinearLayout>

                    <android.support.v7.widget.RecyclerView
                        android:id="@+id/recycler_view_primiumGameList"
                        android:layout_width="match_parent"
                        android:layout_height="match_parent"
                        android:isScrollContainer="false"
                        android:nestedScrollingEnabled="false"
                        android:paddingBottom="3dp"
                        android:paddingLeft="5dp"
                        android:paddingRight="5dp"
                        android:paddingTop="3dp" />

                </LinearLayout>

            </LinearLayout>

        </android.support.v4.widget.NestedScrollView>

    </FrameLayout>

</LinearLayout>

我注意到将我的RecyclerView放入NestedScrollView中的一个问题。我意识到滚动我的RecyclerView的内容松弛。在滚动中获取问题。并且一个主要问题是在NestedScrollView中加载更多数据来加载数据。 解决方案:使用加载更多这样的事件

mRecAdapter = new RecyclerAdapter(recylerView,
        primiumgameDetailsArrayList, getActivity(), cost);
recylerView.setAdapter(mRecAdapter);

//set load more listener for the RecyclerView adapter
mRecAdapter.setOnLoadMoreListener(new OnLoadMoreListener() {
    @Override
    public void onLoadMore () {
    **mRecyclerView.setNestedScrollingEnabled(false);**
        if (reqCountStatus.equalsIgnoreCase("true")) {
            primiumgameDetailsArrayList.add(null);
            mRecAdapter.notifyItemInserted(primiumgameDetailsArrayList.size() - 1);
            new Handler().postDelayed(new Runnable() {
                @Override
                public void run() {

                    primiumgameDetailsArrayList.remove(primiumgameDetailsArrayList.size() - 1);
                    mRecAdapter.notifyItemRemoved(primiumgameDetailsArrayList.size());
                    int index = primiumgameDetailsArrayList.size();
                    primiumGameloadData(mRecyclerView, index);
                }
            }, 5000);
        } else {
            mRecyclerView.setNestedScrollingEnabled(false);
            Toast.makeText(getActivity().getApplicationContext(),
                    "Loading data completed", Toast.LENGTH_SHORT).show();
        }
    }
});

注意:我必须使用此方法mRecyclerView.setNestedScrollingEnabled(false);禁用我的RecyclerView的滚动功能,并在加载更多数据请求时启用mRecyclerView.setNestedScrollingEnabled(true)