Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to use infinite scrolling recyclerview inside nestedscrollview?

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);
    }
}
like image 617
Jshin Avatar asked Nov 07 '22 09:11

Jshin


1 Answers

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"/>
like image 137
AskNilesh Avatar answered Nov 14 '22 21:11

AskNilesh