Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to scrollto an offset inside recyclerview?

How do I scroll to a particular position with an offset inside recyclerview?

I have used

public LinearLayoutManager linearlayoutmanager;
linearlayoutmanager.scrollToPositionWithOffset(0, scrolled);

Also I have used scrollto

mRecyclerView.scrollTo(0, scrolled);

Also I have used smoothScrolltoposition

mRecyclerView.smoothScrollToPosition(scrolled);

But none seems to working for me.

If anyone knows anything about this please could you help me

UPDATE

Function where i am setting adapter of my Recyclerview

public void Nearby_Search_requestData() {
    OkHttpClient client = new OkHttpClient();
    client = MySSLTrust.trustcert(getActivity());

    RestAdapter adapter = new RestAdapter.Builder().setEndpoint(SEARCH_MERCHANT_ENDPOINT).setClient(new OkClient(client)).build();
    final RetrofitInterface api = adapter.create(RetrofitInterface.class);
    if (api != null) {
        api.post_Nearby_Search(page.toString(), new Callback<Nearby_Search_All>() {
            @Override
            public void success(final Nearby_Search_All server_data, Response response) {
                if (server_data.getSuccess() == 1) {
                    if (server_data.getResults().size() == 0) {
                        if (page != 0) {
                            mRecyclerView.scrollToPosition(firstVis);
                        } else {
                            Log.d("hii", "zero");
            //                NO_MERCHANT.setVisibility(View.VISIBLE);
                            mAdapter = new searchrecyclerviewadapter(getActivity(), data, font);
                            mRecyclerView.setAdapter(mAdapter);
                        }
                    } else {
                        Log.d("scroll", "hii");
            //            NO_MERCHANT.setVisibility(View.INVISIBLE);
                        if (server_data.getSize() > server_data.getResults().size()) {
                            stay_on_this_page = true;
                        } else {
                            stay_on_this_page = false;
                        }
                        if (page == 0) {
                            prev_total = 0;
                            data.clear();
                            Log.d("hii", "Page is zero " + prev_total);
                            list_size = server_data.getSize();
                        } else {
                            Log.d("hii", "prev_total is " + prev_total + " Size is " + server_data.getSize() + " page is " + page);
                            prev_total = server_data.getSize() * page;
                            Log.d("hii", "Now prev_total is " + prev_total);
                        }
                        total_curr = server_data.getResults().size();

                        Log.d("hii", "first place is " + server_data.getResults().get(0).getShop_name());

                        for (int i = 0; i < total_curr; i++) {
                            information current = new information();
                            current.title = server_data.getResults().get(i).getShop_name();
                            String street = server_data.getResults().get(i).getAddress().getStreet();
                            String area = server_data.getResults().get(i).getAddress().getArea();
                            current.Address = street + " " + area;
                            String[] splited = area.split(",");
                            current.area1 = splited[1];
                            current.type = server_data.getResults().get(i).getShop_type();
                            current.rating = server_data.getResults().get(i).getRating();
                            current.distance = server_data.getResults().get(i).getDistance();
                            current.jeb_no = server_data.getResults().get(i).getJeb_no();
                            current.total_photos = server_data.getResults().get(i).getTotal_photos();
                            if (current.total_photos  == 0) {

                            } else if (current.total_photos  == 1) {
                                current.photo_1 = server_data.getResults().get(i).getPhotos().getPhoto_1();
                            } else if (current.total_photos  == 2) {
                                current.photo_1 = server_data.getResults().get(i).getPhotos().getPhoto_1();
                                current.photo_2 = server_data.getResults().get(i).getPhotos().getPhoto_2();
                            } else {
                                current.photo_1 = server_data.getResults().get(i).getPhotos().getPhoto_1();
                                current.photo_2 = server_data.getResults().get(i).getPhotos().getPhoto_2();
                            }
                            data.add(current);
                        }
                        if (adapterinitialised) {
                            mAdapter.notifyDataSetChanged();
                        } else {
                            mAdapter = new searchrecyclerviewadapter(getActivity(), data, font);
                          //  mAdapter.setClickListener(Search.class);
                            mRecyclerView.setAdapter(mAdapter);

                            adapterinitialised = true;
                        }
                    }
                 //   mRecyclerView.scrollToPosition(firstVis);
                    Log.d("scroll", "hee");
                    scrolled = scrolled + 10;
                    Log.d("scroll", "scrolled: " + scrolled);
                    // ALL BELOW CODE I HAVE TRIED FOR SCROLLING BUT NONE WAS HELPFUL
                /*    mRecyclerView.post(new Runnable() {
                        @Override
                        public void run() {
                            mRecyclerView.smoothScrollToPosition(scrolled);

                            // or do mRecyclerView.scrollTo(0, scrolled);
                        }
                    });
                    */
                 //   l.scrollToPositionWithOffset(0, scrolled);
                //    mRecyclerView.smoothScrollToPosition(scrolled);
                //    mRecyclerView.scrollBy(0, scrolled);
                //    l.scrollToPosition();
                //        mRecyclerView.scrollToPosition(scrolled);
                //    mRecyclerView.smoothScrollBy(0, scrolled);
                //    mRecyclerView.scrollBy(0, 10);
                //    mRecyclerView.scrollTo(0, 10);

                } else {
                    Log.d("hii", server_data.getMessage());
                    Toast.makeText(getActivity(), server_data.getMessage(), Toast.LENGTH_SHORT).show();
                }
            }

            @Override
            public void failure(RetrofitError retrofitError) {
                Log.d("hii", "failure");
                Log.e("hii", retrofitError.toString());
                Toast.makeText(getActivity(), retrofitError.toString(), Toast.LENGTH_SHORT).show();
            }
        });
    } else {
        Log.d("hii", "api null");
    }
}
like image 788
aman verma Avatar asked Dec 14 '15 16:12

aman verma


1 Answers

Here is my answer. Set

LinearLayoutManager linearLayoutManager = new LinearLayoutManager(context);
linearLayoutManager.setOrientation(LinearLayoutManager.VERTICAL);//or HORIZONTAL
recyclerView.setLayoutManager(linearLayoutManager);
adapter = new Adapter(...);
recyclerView.setAdapter(adapter);

This provides direction of your RecyclerView, adapter and data (replace ... with context, list, array or another data needed). Than set

linearLayoutManager.scrollToPositionWithOffset(position, offset);

Now the interesting thing:

  • this will scroll to position and place it at the top of the list in case of VERTICAL linear layout manager an at the left with HORIZONTAL
  • if offset is positive, VERTICAL layout manager will scroll this position downwards by offset in pixels (rightwards with HORIZONTAL layout manager)
  • if position is 0 and offset is positive, than nothing will happen, because RecyclerView does not have any items positioned at the top of your 0 position (at the left with HORIZONTAL layout manager)
  • if position is 0 and offset is negative, than VERTICAL layout manager will scroll 0 position upwards by offset in pixels (leftwards with HORIZONTAL)
  • also nothing will happen if RecyclerView's height (width with HORIZONTAL orientation) is smaller than screen size
  • also it will scroll wrongly if position to scroll to is last or near the end and its height (width in case of HORIZONTAL orientation) is relatively small

Hope this will clarify situation for you with RecyclerView's layout manager

like image 112
Roman T. Avatar answered Oct 15 '22 05:10

Roman T.