简体   繁体   中英

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);
            }
        }
        });
    }

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 .

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM