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

时间:2019-03-25 14:46:27

标签: android android-recyclerview android-view recyclerview-layout gridlayoutmanager

我在应用程序的recyclerView中使用了3个跨度计数的GridLayoutManager,问题是我第一次运行该应用程序时,由于来自服务器的项的限制/分页,它仅显示前10个项,而用户使用{ {1}}或滚动它可以继续加载其他项目,但是第一次加载时看起来很难看,所以我想填补这些空白而无需刷新以加载其他项目

这是带有滚动侦听器的网格布局

SwipeRefreshLayout

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

图片描述的问题

1 个答案:

答案 0 :(得分:1)

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

  1. 您可以在加载第一批之后再调用一次getData方法,以获取更多数据,这不是一个干净的解决方案,因为您可能需要在平板电脑等较大屏幕上放置更多物品。

  2. 将更多加载过程放入回收器视图适配器的onBindViewHolder方法中,而不是在滚动侦听器中。例如,如果position == getItemCount()-1如果最后一个项目在视图中(或需要绑定)而请求服务器提供更多项目,则可以做更多的装载。请记住,您必须保留一个布尔值,以防止对getData进行重复调用。