使用第一次3跨度计数的GridLayoutManager在RecyclerView中加载10个以上的项目

问题描述 投票:0回答:1

我在我的应用程序上使用RecyclerView中的3个跨度计数的GridLayoutManager,问题是当我第一次运行应用程序时,由于来自服务器的项目的限制/分配,当用户使用SwipeRefreshLayout刷新或滚动它时,它只显示前10个项目继续加载其他物品,但在首次加载物品时看起来很难看,所以我想填补这些空白,无需刷新加载其他物品

这是带有滚动侦听器的gridlayout

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

        });

用图像描述的问题

android android-recyclerview android-view recyclerview-layout gridlayoutmanager
1个回答
1
投票

问题是您的项目数量不足以填满整个页面。有两种方法可以解决这个问题。

  1. 您可以在加载第一批后再次调用getData方法以获取更多数据,这不是一个干净的解决方案,因为您可能需要更大的屏幕上的更多项目,如平板电脑。
  2. 将您的加载更多过程放在您的回收器视图适配器的onBindViewHolder方法中,而不是在滚动侦听器上。如果position == getItemCount()-1例如,如果您的最后一个项目进入视图(或需要绑定)请求服务器更多项目,您可以更多地加载。请记住,你必须持有一个布尔值,以防止重复调用你的getData
© www.soinside.com 2019 - 2024. All rights reserved.