7

I have Recyclerview inside the nestedscrollview and I want to scroll the nestedscrollview to the buttom display loading and load more list to recyclerview.

Here is my 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>
Angkor Empire
  • 191
  • 1
  • 4
  • 11
  • take a look at this to understand how to use this concept https://github.com/codepath/android_guides/wiki/Endless-Scrolling-with-AdapterViews-and-RecyclerView – kshitij jain Dec 06 '16 at 08:08
  • @kshitijjain If `NestedScrollView` is a scroll container, your code won't work. – wonsuc Sep 17 '17 at 11:21

2 Answers2

18

you can do it in two ways :

1- adding header to recyclerview

2- using setOnScrollChangeListener method of NestedScrolview

I prefer the second way :

 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();
                        }
                    }
                }
            }
        });
    }
iDeveloper
  • 1,420
  • 16
  • 43
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>

I Noted one issue putting my RecyclerView inside the NestedScrollView. I realized that scrolling the content of my RecyclerView slacked.Getting issue in scrolling. And one main issue load more data getting issue for load data inside NestedScrollView. Solution: use load more event like this

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

Note:I had to disable the scroll functionality of my RecyclerView with this method mRecyclerView.setNestedScrollingEnabled(false); and enable when load more request for data mRecyclerView.setNestedScrollingEnabled(true)

Boban S.
  • 1,583
  • 11
  • 16