Recycler view comes to initial item when the next page of items are loaded

594 Views Asked by At

I have done paging for my recyclerview to fetch items from api using volley, i have tried a solution which is already asked , but what i am facing is when a new items are loaded from next page means, page refresh and loads from a start, so can anyone help on how to load item continuously without loading from a start.. Your suggestion and answeres will be more helpful...

My code followed by

HomeActivity.java

public class HomeActivity extends AppCompatActivity  {

private ListOfItemAdapter listOfItemAdapter;
    private RecyclerView mainRecyclerView;
    private ArrayList<ListOfItem> mainListOfItem;
    private SwipeRefreshLayout swipeRefreshLayout;
    SessionManager sessionManager;
    private String requestUrl = "my_url";
    private int pageNumber;
    private int visibleItemCount , totalCount, pastVisibleItem;
    private boolean loading=true;

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        getSupportActionBar().setElevation(0);
        getSupportActionBar().setDisplayOptions(ActionBar.DISPLAY_SHOW_CUSTOM);
        getSupportActionBar().setCustomView(R.layout.toolbar_title_layout);
                setContentView(R.layout.activity_home);

        init();

    }

    private void init() {
       
          listOfItemAdapter = new ListOfItemAdapter(this);
        swipeRefreshLayout = findViewById(R.id.itemSwipe);
        pageNumber =1;
        mainListOfItem = new ArrayList<>();
        sessionManager = new SessionManager(this);
        sessionManager.checkLogin();
        mainRecyclerView = findViewById(R.id.recycler_view);
        mainRecyclerView.setHasFixedSize(true);
        final LinearLayoutManager layoutManager = new LinearLayoutManager(getApplicationContext());
        mainRecyclerView.setLayoutManager(layoutManager);
        floatingActionButton = findViewById(R.id.floatingActionButton);
        getRequestList(requestUrl,pageNumber);

         swipeRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
            @Override
            public void onRefresh() {
                mainListOfItem.clear();
                pageNumber=1;
                loading=true;
                getRequestList(requestUrl,pageNumber);
            }
        });

        mainRecyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
            @Override
            public void onScrolled(@NonNull RecyclerView recyclerView, int dx, int dy) {
                super.onScrolled(recyclerView, dx, dy);
                if(dy>0)
                {
                    visibleItemCount = layoutManager.getChildCount();
                    totalCount = layoutManager.getItemCount();
                    pastVisibleItem = layoutManager.findFirstVisibleItemPosition();

                    if(loading)
                    {
                        if((visibleItemCount + pastVisibleItem) >= totalCount) {
                            swipeRefreshLayout.setRefreshing(true);
                            loading = false;
                            pageNumber += 1;
                            getRequestList(requestUrl, pageNumber);
                        }
                    }
                }
            }
        });

    }

    private void getRequestList(String Url, final int pNumber) {

    StringRequest stringRequest = new StringRequest(Request.Method.POST, Url, new Response.Listener<String>() {
        @Override
        public void onResponse(String response) {
            swipeRefreshLayout.setRefreshing(false);

            try {
                JSONObject responseObject = new JSONObject(response);
                String success = responseObject.getString("success");
                if(success.equalsIgnoreCase("true")) {
                    JSONObject object1 = responseObject.getJSONObject("data");
                    JSONArray jsonArray = object1.getJSONArray("data");
                    for (int i = 0; i < jsonArray.length(); i++) {
                        JSONObject data = jsonArray.getJSONObject(i);
                        String itemId = data.getString("item_id");
                        String titleViewUrl = data.getString("name");
                        String imageViewUrl = data.getString("picture");
                        String descriptionViewUrl = data.getString("description");
                        String costViewUrl = data.getString("price");

                        mainListOfItem.add(new ListOfItem(itemId, imageViewUrl, titleViewUrl, descriptionViewUrl, costViewUrl));
                    }
                    if(!mainListOfItem.isEmpty())
                    {
                        loading = true;
                        swipeRefreshLayout.setRefreshing(false);
                    }
                    else
                    {
                        StyleableToast.makeText(HomeActivity.this,"No more item available", Toast.LENGTH_LONG,R.style.failuretoastStyle).show();
                    }

                }
                listOfItemAdapter = new ListOfItemAdapter(HomeActivity.this );
                mainRecyclerView.setAdapter(listOfItemAdapter);
              listOfItemAdapter.setData(mainListOfItem);

                itemClick();
            } catch (JSONException e) {
                e.printStackTrace();
                Log.d("items", "error:" + e.toString());
            }
        }
    }, new Response.ErrorListener() {
        @Override
        public void onErrorResponse(VolleyError error) {
            error.printStackTrace();
        }
    }) {
        @Override
        protected Map<String, String> getParams() {
            Map<String,String> params = sessionManager.getUserDetail();
            params.put("user_id", params.get(SessionManager.USER_ID));
            params.put("access_token", params.get(SessionManager.ACCESS_TOKEN));
            params.put("page",String.valueOf(pNumber));
            return params;
        }
    };
        VolleySingleton.getInstance(HomeActivity.this).addtoRequestQueue(stringRequest);
    }
}

and my singleton followed by

VolleySingleton.java

public class VolleySingleton {
    private static VolleySingleton mInstance;
    private static Context context;
    private RequestQueue mRequestQueue;

    private VolleySingleton(Context context)
    {
        mRequestQueue = Volley.newRequestQueue(context.getApplicationContext());
    }

    public static synchronized VolleySingleton getInstance(Context context)
    {
        if(mInstance == null)
        {
            mInstance = new VolleySingleton(context);
        }
        return mInstance;
    }

    public RequestQueue getRequestQueue() {

        if(mRequestQueue == null)
        {
            mRequestQueue = Volley.newRequestQueue(context.getApplicationContext());
        }
        return mRequestQueue;
    }

    public  <T>  void addtoRequestQueue(Request <T> request)
    {
        mRequestQueue.add(request);
    }
}


1

There are 1 best solutions below

3
On

This is the simple solution for your problem.

Declare a variable of int type for current position which will hold current position before pagination.

public class HomeActivity extends AppCompatActivity  {

private ListOfItemAdapter listOfItemAdapter;
    private RecyclerView mainRecyclerView;
    private ArrayList<ListOfItem> mainListOfItem;
    private SwipeRefreshLayout swipeRefreshLayout;
    SessionManager sessionManager;
    private String requestUrl = "my_url";
    private int pageNumber;
    private int visibleItemCount , totalCount, pastVisibleItem;
    private boolean loading=true;
    private int lastPosition=-1;
@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        getSupportActionBar().setElevation(0);
        getSupportActionBar().setDisplayOptions(ActionBar.DISPLAY_SHOW_CUSTOM);
        getSupportActionBar().setCustomView(R.layout.toolbar_title_layout);
                setContentView(R.layout.activity_home);

        init();

    }

    private void init() {
       
          listOfItemAdapter = new ListOfItemAdapter(this);
        swipeRefreshLayout = findViewById(R.id.itemSwipe);
        pageNumber =1;
        mainListOfItem = new ArrayList<>();
        sessionManager = new SessionManager(this);
        sessionManager.checkLogin();
        mainRecyclerView = findViewById(R.id.recycler_view);
        mainRecyclerView.setHasFixedSize(true);
        final LinearLayoutManager layoutManager = new LinearLayoutManager(getApplicationContext());
        mainRecyclerView.setLayoutManager(layoutManager);
        floatingActionButton = findViewById(R.id.floatingActionButton);
        getRequestList(requestUrl,pageNumber);

         swipeRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
            @Override
            public void onRefresh() {
                mainListOfItem.clear();
                pageNumber=1;
                loading=true;
                getRequestList(requestUrl,pageNumber);
            }
        });

        mainRecyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
            @Override
            public void onScrolled(@NonNull RecyclerView recyclerView, int dx, int dy) {
                super.onScrolled(recyclerView, dx, dy);
                if(dy>0)
                {
                    visibleItemCount = layoutManager.getChildCount();
                    totalCount = layoutManager.getItemCount();
                    pastVisibleItem = layoutManager.findFirstVisibleItemPosition();

                    if(loading)
                    {
                        if((visibleItemCount + pastVisibleItem) >= totalCount) {
                            swipeRefreshLayout.setRefreshing(true);
                            loading = false;
                            pageNumber += 1;
                            getRequestList(requestUrl, pageNumber);
                            lastPosition=mainListOfItem.size();
                        }
                    }
                }
            }
        });

    }

    private void getRequestList(String Url, final int pNumber) {

    StringRequest stringRequest = new StringRequest(Request.Method.POST, Url, new Response.Listener<String>() {
        @Override
        public void onResponse(String response) {
            swipeRefreshLayout.setRefreshing(false);

            try {
                JSONObject responseObject = new JSONObject(response);
                String success = responseObject.getString("success");
                if(success.equalsIgnoreCase("true")) {
                    JSONObject object1 = responseObject.getJSONObject("data");
                    JSONArray jsonArray = object1.getJSONArray("data");
                    for (int i = 0; i < jsonArray.length(); i++) {
                        JSONObject data = jsonArray.getJSONObject(i);
                        String itemId = data.getString("item_id");
                        String titleViewUrl = data.getString("name");
                        String imageViewUrl = data.getString("picture");
                        String descriptionViewUrl = data.getString("description");
                        String costViewUrl = data.getString("price");

                        mainListOfItem.add(new ListOfItem(itemId, imageViewUrl, titleViewUrl, descriptionViewUrl, costViewUrl));
                    }
                    if(!mainListOfItem.isEmpty())
                    {
                        loading = true;
                        swipeRefreshLayout.setRefreshing(false);
                    }
                    else
                    {
                        StyleableToast.makeText(HomeActivity.this,"No more item available", Toast.LENGTH_LONG,R.style.failuretoastStyle).show();
                    }

                }
                listOfItemAdapter = new ListOfItemAdapter(HomeActivity.this );
                mainRecyclerView.setAdapter(listOfItemAdapter);
                listOfItemAdapter.setData(mainListOfItem);
                if(pageNumber!=1){
                mainRecyclerView.smoothScrollToPosition(lastPosition);
                }

                itemClick();
            } catch (JSONException e) {
                e.printStackTrace();
                Log.d("items", "error:" + e.toString());
            }
        }
    }, new Response.ErrorListener() {
        @Override
        public void onErrorResponse(VolleyError error) {
            error.printStackTrace();
        }
    }) {
        @Override
        protected Map<String, String> getParams() {
            Map<String,String> params = sessionManager.getUserDetail();
            params.put("user_id", params.get(SessionManager.USER_ID));
            params.put("access_token", params.get(SessionManager.ACCESS_TOKEN));
            params.put("page",String.valueOf(pNumber));
            return params;
        }
    };
        VolleySingleton.getInstance(HomeActivity.this).addtoRequestQueue(stringRequest);
    }
}