Ahmet Yılmaz
Ahmet Yılmaz

Reputation: 67

RecyclerView pagination does not load properly?

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

Answers (1)

Navjot
Navjot

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

  • Don't reinitialize and reset the adapter to recycler view more than once. Instead, use the same adapter and update the userOrders list.
  • Use recycler view's ListAdapter instead of RecyclerView.Adapter for OrderByPointsAdapter.

Upvotes: 1

Related Questions