Загрузите более 10 элементов в RecyclerView с GridLayoutManager с 3-мя интервалами в первый раз - PullRequest
0 голосов
/ 25 марта 2019

Я использую в моем приложении GridLayoutManager с 3-мя счетами в recyclerView, проблема в том, что когда я запускаю приложение в первый раз, оно показывает только первые 10 элементов из-за ограничения / разбиения элементов на сервере, когда пользователь обновляется с помощью SwipeRefreshLayout или прокрутка, она продолжает загружать другие элементы, но при первой загрузке элементов это выглядит уродливо, поэтому я хочу заполнить эти пробелы без необходимости обновления для загрузки других элементов

вот это сетка с прослушивателем прокрутки

gridLayoutManager = new GridLayoutManager(MainActivity.this, 3);

 recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
            @Override
            public void onScrollStateChanged(@NonNull RecyclerView recyclerView, int newState) {
                super.onScrollStateChanged(recyclerView, newState);
                if (newState == AbsListView.OnScrollListener.SCROLL_STATE_TOUCH_SCROLL) {
                    isScrolling = true;
                    progressBar.setVisibility(View.GONE);

                }

            }

            @Override
            public void onScrolled(@NonNull RecyclerView recyclerView, int dx, int dy) {
                super.onScrolled(recyclerView, dx, dy);
                if (dy > 0) {
                        currentItems = gridLayoutManager.getChildCount();
                        totalItems = gridLayoutManager.getItemCount();
                        scrollOutItems = gridLayoutManager.findFirstVisibleItemPosition();

                    if (isScrolling && (currentItems + scrollOutItems == totalItems)) {
                        isScrolling = false;
                        if (getItemsByLabelCalled) {
                            for (int i = 1; i < 7; i++) {
                                if (navigationView.getMenu().getItem(i).isChecked()) {
                                    getItemsByLabel(navigationView.getMenu().getItem(i).getTitle().toString());
                                }
                            }
                        } else {
                            getData();
                        }
                    }
                }
            }
        });

SwipeRefreshLayout

swipeRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
            @Override
            public void onRefresh() {
                if (navigationView.getMenu().getItem(0).isChecked()) {
                    if (Utils.hasNetworkAccess(MainActivity.this)) {
                        getData();
                    } else {
                        Toast.makeText
                                (MainActivity.this, R.string.SwipeRefreshLayout_connect_to_update
                                        , Toast.LENGTH_LONG).show();
                    }
                } else {
                    for (int i = 1; i < 7; i++) {
                        if (navigationView.getMenu().getItem(i).isChecked()) {
                            getItemsByLabel(navigationView.getMenu().getItem(i).getTitle().toString());
                        }
                    }
                }

                new Handler().postDelayed(() -> swipeRefreshLayout.setRefreshing(false), 2000);
            }

        });

Проблема, описанная с изображениями

image

image

1 Ответ

1 голос
/ 25 марта 2019

Проблема в том, что количество ваших товаров недостаточно для заполнения всей страницы.Существует два способа решения этой проблемы.

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

  2. Поместите свою дополнительную процедуру в метод onBindViewHolder адаптера представления вашего рециркулятора вместо прослушивателя с прокруткой.Вы можете выполнить дополнительную загрузку, если, например, position == getItemCount()-1, который запрашивает у сервера дополнительные элементы, если последний элемент отображается (или требуется привязка).Помните, что вы должны держать логическое значение, чтобы предотвратить повторные вызовы на getData.

...