Как использовать LazyLoader и PullToRefresh в recyclerView?

ПОЧЕМУ МНЕ НЕ ПОМОГАЕТ ??? мне действительно нужна твоя помощь

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

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

Я имею в виду: при использовании pullToRefresh не работает ленивый загрузчик!

Мои коды:

    @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) {

            }
        });
    }
}

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

Доктор Конг: вам уже сказали здесь, что вы не должны КРИЧАТЬ в отношении людей, не так ли? вы действительно думаете, что получите какой-либо ответ, если единственное изменение в вашем вопросе - смена ника?

pskink 11.06.2018 07:31

@pskink, извини, дорогая, но никто мне не помогает? Мне нужна помощь :(

Hock 11.06.2018 07:41

Люди помогают, если могут, и если они заметят ваш вопрос, вам действительно не стоит плакать об этом в первой строке вопроса.

Marko Zajc 11.06.2018 07:53

Вы можете мне объяснить, чего вы добиваетесь? Ваш вопрос сбивает с толку. Обновить с помощью SwipeRefreshLayout? А какая часть не работает? Выдает исключение? Данные не обновляются?

Yosi Pramajaya 11.06.2018 08:14

@YosiPramajaya, да, для использования pullToRefresh я использовал SwipeRefreshLayout, при использовании pullToRefresh получаю обновленные данные, а не проблемы с данными обновления. но при использовании pullToRefresh при прокрутке на ресайклере и получении до конца списка lazyLoader не работает! можешь мне помочь? пожалуйста

Hock 11.06.2018 08:29

@YosiPramajaya, ты здесь мой друг? можешь мне помочь? пожалуйста

Hock 11.06.2018 08:42

Все еще пытаюсь понять ваш вопрос. Что значит, когда вы сказали: тогда не работает lazyLoader? Вы имеете в виду, что это не работает? Когда? Когда вы прокручиваете больше, когда вы тянете, чтобы обновить, или и то, и другое? Что такое lazyLoader, вы имеете в виду вызов асинхронной модификации?

Yosi Pramajaya 11.06.2018 08:44

@YosiPramajaya. при использовании pull To Refresh то не работает ленивый загрузчик. Я имею в виду, когда использую pullToRefresh, когда при получении последнего элемента recyclerView не работает lazyLoad

Hock 11.06.2018 09:31

@Hock Покажи мне свой код для AuctionsListAdapter

Yosi Pramajaya 11.06.2018 11:21

@YosiPramajaya. я загрузил по этой ссылке: ufile.io/lz1mr, вы можете мне помочь? пожалуйста

Hock 11.06.2018 11:33
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
10
118
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Думаю проблема в вашем методе getData().

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

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

На самом деле, то, что вы сделали на вашем onLoadMore(), правильно там, где вы изменяете List внутри вашего адаптера. Вы должны сделать то же самое (или подобное) на вашем 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;
}

Можете ли вы прислать мне код с моими кодами? пожалуйста. Я любитель и очень нуждаюсь в вашей помощи. пожалуйста

Hock 11.06.2018 11:51

ты здесь мой друг? можешь мне помочь? пожалуйста

Hock 11.06.2018 12:55

Почему не ответил мне мой друг? : D

Hock 11.06.2018 14:30

Вы должны знать, что у большинства из нас здесь настоящая жизнь, поэтому мы не можем 24 часа смотреть треды. Наберитесь терпения.

Yosi Pramajaya 11.06.2018 14:40

Можете ли вы, мой друг, помочь, но какой код для этой строки: auctionListAdapter.setModel(todayModel);, какой код добавить в адаптер для использования кода setModel?

Hock 11.06.2018 15:11

На самом деле это просто сеттер. Посмотрите мой отредактированный ответ.

Yosi Pramajaya 11.06.2018 15:18

Спасибо за обновление. в onLoadMore вы используете getData();, а в этом коде: apis.getTodatAuctions(jwtToken, 1, 10); 1 - это номер страницы, но в onLoadMore следует получать данные из другие страницы. при использовании getData в onLoadMore каждый раз показывать элементы из Страница 1. как я могу это исправить?

Hock 11.06.2018 15:20

Вы можете редактировать, чтобы стать getData(int page). И когда вы вызываете getData(), вы можете указать любую страницу в качестве параметра.

Yosi Pramajaya 11.06.2018 15:24

Вы можете прислать мне свой скайп-идентификатор? пожалуйста

Hock 12.06.2018 07:24

Почему? Вы всегда можете спросить здесь, и я уверен, что есть много других профессионалов, которые вам помогут. :) А ваши вопросы могут помочь другим разработчикам учиться и учиться

Yosi Pramajaya 14.06.2018 01:07

Другие вопросы по теме