How to use infinite scrolling recyclerview inside nestedscrollview?
Asked Answered
O

2

6

The height of the screen is not enough because there are many items containing two recyclerviews on one screen. So I tried to have a child view in a nestedscrollview. however, all the items are loaded at once, or recyclers are not recycled.

So I have read other articles and have tried but its not worked for me.

for example To add app:layout_behavior="@string/appbar_scrolling_view_behavior" or mRecyclerView.setNestedScrollingEnabled(false);

If you know how to do it, please let me know. thanks for reading.

This is my java code

myDataset = new ArrayList<>();
    mRecyclerView = (RecyclerView) rootView.findViewById(R.id.map_recycler_view);
    LinearLayoutManager mLayoutManager = new LinearLayoutManager(mcontext);
    mLayoutManager.setAutoMeasureEnabled(true);
    mRecyclerView.setLayoutManager(mLayoutManager);
    mAdapter = new MyAdapter(this);
    mAdapter.setLinearLayoutManager(mLayoutManager);
    mAdapter.setRecyclerView(mRecyclerView);
    mRecyclerView.setAdapter(mAdapter);

and this is my xml code

<android.support.v4.widget.NestedScrollView
    android:id="@+id/nestedScrollView"
    android:layout_width="match_parent"
    android:layout_height="wrap_content">


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


        <FrameLayout
            android:layout_width="match_parent"
            android:layout_height="180dp">

            <fragment
                android:id="@+id/googleMap"
                android:name="com.google.android.gms.maps.SupportMapFragment"
                android:layout_width="match_parent"
                android:layout_height="match_parent" />

        </FrameLayout>

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



            <android.support.v7.widget.RecyclerView
                android:id="@+id/tag_recycler_view"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:descendantFocusability="blocksDescendants"
                app:layout_behavior="@string/appbar_scrolling_view_behavior"
                app:layoutManager="LinearLayoutManager">

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

        </LinearLayout>

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


                <android.support.v7.widget.RecyclerView
                    android:id="@+id/map_recycler_view"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:scrollbars="vertical"
                    android:nestedScrollingEnabled="false">
                </android.support.v7.widget.RecyclerView>

            </LinearLayout>

        </LinearLayout>

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

this is my adapter code it is too many so i upload relevant part It add a new item when reach the bottom of the recyclerview.

public interface OnLoadMoreListener {
    void onLoadMore();
}

public MyAdapter(OnLoadMoreListener onLoadMoreListener) {
    this.onLoadMoreListener = onLoadMoreListener;
    mDataset = new ArrayList<>();
}

public void setLinearLayoutManager(LinearLayoutManager linearLayoutManager) {
    this.mLinearLayoutManager = linearLayoutManager;
}

public void setRecyclerView(final RecyclerView mView) {
    mView.addOnScrollListener(new RecyclerView.OnScrollListener() {
        @Override
        public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
            super.onScrollStateChanged(recyclerView, newState);

            if (newState == RecyclerView.SCROLL_STATE_SETTLING) {
                visibleItemCount = recyclerView.getChildCount();
                totalItemCount = mLinearLayoutManager.getItemCount();
                firstVisibleItem = mLinearLayoutManager.findFirstVisibleItemPosition();
                lastVisibleItem = mLinearLayoutManager.findLastVisibleItemPosition();

                if (!isMoreLoading && (totalItemCount - visibleItemCount)<= (firstVisibleItem + visibleThreshold)) {
                    if (onLoadMoreListener != null) {
                        onLoadMoreListener.onLoadMore();
                        isMoreLoading = true;
                    }
                }
            }
        }
    });
}

@Override
public int getItemViewType(int position) {
    return mDataset.get(position) != null ? VIEW_ITEM : VIEW_PROG;
}

@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    if (viewType == VIEW_ITEM) {
        context = parent.getContext();
        return new StudentViewHolder(LayoutInflater.from(parent.getContext()).inflate(R.layout.home_contents, parent, false));
    } else {
        context = parent.getContext();
        return new ProgressViewHolder(LayoutInflater.from(parent.getContext()).inflate(R.layout.item_progress, parent, false));
    }
}

public void addAll(List<mainitem> lst) {
    mDataset.clear();
    mDataset.addAll(lst);
    notifyDataSetChanged();
}

public void addItemMore(List<mainitem> lst) {
    mDataset.addAll(lst);
    notifyItemRangeChanged(mDataset.size()-6, mDataset.size());
}


public void setMoreLoading(boolean isMoreLoading) {
    this.isMoreLoading=isMoreLoading;
}

@Override
public int getItemCount() {
    return mDataset.size();
}

public void setProgressMore(final boolean isProgress) {
    if (isProgress) {
        new Handler().post(new Runnable() {
            @Override
            public void run() {
                mDataset.add(null);
                notifyItemInserted(mDataset.size() - 1);
            }
        });
    } else if(!isProgress) {
        mDataset.remove(mDataset.size() - 1);
        notifyItemRemoved(mDataset.size()-1);
    }
}
Overwind answered 23/3, 2018 at 11:45 Comment(0)
W
1

Use android:nestedScrollingEnabled="false" to your RecyclerView

<android.support.v7.widget.RecyclerView
    android:id="@+id/map_recycler_view"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:descendantFocusability="blocksDescendants"
    android:nestedScrollingEnabled="false"
    app:layoutManager="LinearLayoutManager"/>
Warehouseman answered 23/3, 2018 at 11:49 Comment(8)
I added it in my java code already, but it did not work for meOverwind
It changes my recyclerview like a linearlayout but thank you for your adviseOverwind
@Overwind remove this ` app:layout_behavior="@string/appbar_scrolling_view_behavior"` from recyclerview than tryWarehouseman
It does not cause any events to occur when the first item is loaded but reached the bottom of the recycle view. Could you advise me on my adapter code?Overwind
@Overwind check this ans https://mcmap.net/q/488011/-pagination-not-work-for-the-recyclerview-within-nestedscrollview for load more with recyclerviw using nested scrollviewWarehouseman
It doesn't work perfectly, but now it reacts when it touches the bottom. I really appreciate your advice! really thank you!Overwind
Happy to help youWarehouseman
i implemented something i think can help a few people: https://mcmap.net/q/1917724/-how-to-implement-infinite-scrolling-with-recyclerviewCandler
C
0

The above solution only works if you are using api version above 21, if you want to support it with also lower version please check my answer Stackoverflow Answer

Clemenciaclemency answered 15/9, 2018 at 6:14 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.