Reputation: 67
I need to do pagination for recyclerview. That load 20 data firstly. After scroll, it must load 20 data more. But it load this 20 data as a new list and delete old 20 data. How can add them end of first 20? I tried some different ways but I couldn't get JsonArray succesfully.
FirstFragment.java
public class FirstFragment extends Fragment {
RecyclerView recyclerView;
private ArrayList<UserOrder> userOrders;
OrderByPointsAdapter orderByPointsAdapter;
ProgressBar progressBarMain, progressBarRecy;
private NestedScrollView nestedScrollView;
private int xo=0,yo=20;
@Override
public void onAttach(@NonNull Context context) {
super.onAttach(context);
}
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.row_first, container, false);
progressBarRecy = view.findViewById(R.id.progressBarFirstRecy);
nestedScrollView = view.findViewById(R.id.nestedRowFirst);
recyclerView = view.findViewById(R.id.recyclerFirstRow);
recyclerView.setHasFixedSize(true);
RecyclerView.LayoutManager layoutManager = new LinearLayoutManager(getActivity().getApplicationContext());
recyclerView.setLayoutManager(layoutManager);
loadRecycler(xo,yo);
nestedScrollView.setOnScrollChangeListener(new NestedScrollView.OnScrollChangeListener() {
@Override
public void onScrollChange(NestedScrollView v, int scrollX, int scrollY, int oldScrollX, int oldScrollY) {
if (scrollY == v.getChildAt(0).getMeasuredHeight() - v.getMeasuredHeight()){
xo = xo+20;
yo = yo +20;
progressBarRecy.setVisibility(View.VISIBLE);
loadRecycler(xo, yo);
}
}
});
return view;
}
private void loadRecycler(int xo, int yo) {
Retrofit retrofit = new Retrofit.Builder()
.baseUrl("http://192.168.0.35/")
.addConverterFactory(GsonConverterFactory.create())
.build();
//RequestInterface ekliyoruz
RequestInterface request = retrofit.create(RequestInterface.class);
Call<JsonResponse> call = request.getJSON(String.valueOf(xo),String.valueOf(yo));
call.enqueue(new Callback<JsonResponse>() {
@Override
public void onResponse(Call<JsonResponse> call, Response<JsonResponse> response) {
if (response.isSuccessful() && response.body()!= null){
progressBarRecy.setVisibility(View.GONE);
JsonResponse jsonResponse = response.body();
userOrders = new ArrayList<>(Arrays.asList(jsonResponse.getUserOrders()));
orderByPointsAdapter = new OrderByPointsAdapter(userOrders,getActivity().getApplicationContext());
recyclerView.setAdapter(orderByPointsAdapter);
}
}
});
}
Upvotes: 0
Views: 101
Reputation: 1294
What's Happening?
We are setting the order list from the last response to the recycler view adapter every time. Use the below snippet in the onResponse
function to fix it.
Solution
if (response.isSuccessful() && response.body()!= null){
progressBarRecy.setVisibility(View.GONE);
JsonResponse jsonResponse = response.body();
if(userOrders == null) {
userOrders = new ArrayList<>(Arrays.asList(jsonResponse.getUserOrders()));
} else {
userOrders.addAll(Arrays.asList(jsonResponse.getUserOrders()));
}
orderByPointsAdapter = new OrderByPointsAdapter(userOrders,getActivity().getApplicationContext());
recyclerView.setAdapter(orderByPointsAdapter);
}
Optimisation Tips
userOrders
list.ListAdapter
instead of RecyclerView.Adapter
for OrderByPointsAdapter
.Upvotes: 1