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);
}
}
This is the simple solution for your problem.
Declare a variable of int type for current position which will hold current position before pagination.