Как использовать LazyLoader и PullToRefresh в recyclerView? - PullRequest
0 голосов
/ 11 июня 2018

ПОЧЕМУ ЛЮБОЙ ЛЮДИ НЕ ПОМОГАЮТ МНЕ ???Мне действительно нужны ваши подсказки

В моем приложении я хочу использовать функции PullToRefresh и LazyLoader , и для этого я пишу приведенные ниже коды и работаю со мной.

Но у меня есть одна проблема, когда PullToRefresh recyclerView и когда прокрутка recyclerView не показывает больше элементов.

Я имею в виду: при использовании pullToRefresh , затем не работает lazyLoader !

Мои коды:

    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, Bundle savedInstanceState) {
        super.onCreateView(inflater, container, savedInstanceState);
        Constants.listeners.add(this);
        View v = inflater.inflate(R.layout.fragment_auction_current_tab, null);
        ButterKnife.bind(this, v);
        context = getActivity();
        handler = new Handler();
        list = v.findViewById(R.id.list);
        prefsUtils = new PrefsUtils(getActivity());
        apis = ApiClient.getClient().create(APIs.class);
        swipeToRefresh = v.findViewById(R.id.swipeToRefresh);

        jwtToken = Constants.settings.getString("jwt_token", "");

        list_item = getActivity().findViewById(R.id.list_item);
        linearLayoutManager = new LinearLayoutManager(context);
        auctionListAdapter = new AuctionsListAdapter(context, todayModel, R.layout.list_item_auction_normal_new);
        list.setLayoutManager(linearLayoutManager);
        list.setHasFixedSize(true);
        list.setAdapter(auctionListAdapter);
        list.setOnScrollListener(new EndlessRecyclerLinearPage(linearLayoutManager) {
            @Override
            public void onLoadMore(final int current_page) {
                miniLoader.setVisibility(View.VISIBLE);
                Call<AuctionsListResponse> call = apis.getTodatAuctions(jwtToken, current_page, 10);
                call.enqueue(new Callback<AuctionsListResponse>() {
                    @Override
                    public void onResponse(Call<AuctionsListResponse> call, Response<AuctionsListResponse> response) {
                        if (response.isSuccessful()) {
                            if (response.body() != null) {
                                if (response.body().getRes() != null) {
                                    if (response.body().getRes().getToday().size() > 0 && response.body().getRes().getToday() != null) {
                                        miniLoader.setVisibility(View.GONE);
                                        auctionListAdapter.addNewItem(response.body().getRes().getToday());
                                    } else {
                                        miniLoader.setVisibility(View.GONE);
                                    }
                                }
                            }
                        }
                    }

                    @Override
                    public void onFailure(Call<AuctionsListResponse> call, Throwable t) {

                    }
                });
            }
        });
        getData();
        swipeToRefresh.setColorSchemeResources(R.color.colorAccent);
        swipeToRefresh.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
            @Override
            public void onRefresh() {
                getData();
            }
        });

        return v;
    }

    private void getData() {
        Call<AuctionsListResponse> call = apis.getTodatAuctions(jwtToken, 1, 10);
        call.enqueue(new Callback<AuctionsListResponse>() {
            @Override
            public void onResponse(Call<AuctionsListResponse> call, Response<AuctionsListResponse> response) {
                if (response.isSuccessful()) {
                    if (response.body() != null) {
                        if (response.body().getRes() != null) {
                            if (response.body().getRes().getToday().size() > 0 && response.body().getRes().getToday() != null) {
                                todayModel.clear();
                                todayModel.addAll(response.body().getRes().getToday());
                                auctionListAdapter.notifyDataSetChanged();
                                itemsLoader.setVisibility(View.GONE);
                                if (swipeToRefresh != null) {
                                    swipeToRefresh.setRefreshing(false);
                                }
                            }
                        }
                    }
                }
            }

            @Override
            public void onFailure(Call<AuctionsListResponse> call, Throwable t) {

            }
        });
    }
}

Как я могу это исправитьвопрос

1 Ответ

0 голосов
/ 11 июня 2018

Я думаю, что проблема заключается в вашем getData() методе.

Почему?Когда вы вызываете notifyDataSetChanged() со своего RecyclerView.Adapter, он говорит вашему адаптеру снова проверить список, который у него есть, и полностью перепривязать и перерисовать все в RecyclerView.Но дело в том, что в вашем getData() вы устанавливаете только todayModel Список, который является ссылкой объекта внутри вашего Фрагмента .

Поэтому вам нужно изменить список внутриваш адаптер для того, чтобы добиться успеха notifyDataSetChanged().

На самом деле, то, что вы сделали в вашем onLoadMore(), является правильным, когда вы изменяете список внутри вашего адаптера.Вы должны сделать то же самое (или подобное) в вашем getData().

Пример кода:

@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, Bundle savedInstanceState) {
    super.onCreateView(inflater, container, savedInstanceState);
    Constants.listeners.add(this);
    View v = inflater.inflate(R.layout.fragment_auction_current_tab, null);
    ButterKnife.bind(this, v);
    context = getActivity();
    handler = new Handler();
    list = v.findViewById(R.id.list);
    prefsUtils = new PrefsUtils(getActivity());
    apis = ApiClient.getClient().create(APIs.class);
    swipeToRefresh = v.findViewById(R.id.swipeToRefresh);

    jwtToken = Constants.settings.getString("jwt_token", "");

    list_item = getActivity().findViewById(R.id.list_item);
    linearLayoutManager = new LinearLayoutManager(context);
    auctionListAdapter = new AuctionsListAdapter(context, todayModel, R.layout.list_item_auction_normal_new);
    list.setLayoutManager(linearLayoutManager);
    list.setHasFixedSize(true);
    list.setAdapter(auctionListAdapter);
    list.setOnScrollListener(new EndlessRecyclerLinearPage(linearLayoutManager) {
        @Override
        public void onLoadMore(final int current_page) {
            miniLoader.setVisibility(View.VISIBLE);
            getData(currentPage);
        }
    });
    getData(1);
    swipeToRefresh.setColorSchemeResources(R.color.colorAccent);
    swipeToRefresh.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
        @Override
        public void onRefresh() {
            getData(1);
        }
    });

    return v;
}

private void getData(int page) {
    Call<AuctionsListResponse> call = apis.getTodatAuctions(jwtToken, page, 10);
    call.enqueue(new Callback<AuctionsListResponse>() {
        @Override
        public void onResponse(Call<AuctionsListResponse> call, Response<AuctionsListResponse> response) {
            if (response.isSuccessful()) {
                if (response.body() != null) {
                    if (response.body().getRes() != null) {
                        if (response.body().getRes().getToday().size() > 0 && response.body().getRes().getToday() != null) {
                            todayModel.clear();
                            todayModel
                                 .addAll(response.body()
                                                 .getRes()
                                                 .getToday());

                            //NOTICE THE DIFFERENCE HERE
                            auctionListAdapter.setModel(todayModel);
                            auctionListAdapter.notifyDataSetChanged();
                            itemsLoader.setVisibility(View.GONE);
                            if (swipeToRefresh != null) {
                                swipeToRefresh.setRefreshing(false);
                            }
                            miniLoader.setVisibility(View.GONE);
                        }
                    }
                }
            }
        }

        @Override
        public void onFailure(Call<AuctionsListResponse> call, Throwable t) {
             itemsLoader.setVisibility(View.GONE);
             if (swipeToRefresh != null) {
                swipeToRefresh.setRefreshing(false);
             }
             miniLoader.setVisibility(View.GONE);
        }
    });
}

В вашем AuctionsListAdapter добавить этот метод.Это настроить список, который будет использоваться адаптером для отображения данных:

public void setModel(List<Today> todayModel) {
    this.model = todayModel;
}
...