我在我的应用程序上使用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);
}
});
用图像描述的问题
问题是您的项目数量不足以填满整个页面。有两种方法可以解决这个问题。
getData
方法以获取更多数据,这不是一个干净的解决方案,因为您可能需要更大的屏幕上的更多项目,如平板电脑。onBindViewHolder
方法中,而不是在滚动侦听器上。如果position == getItemCount()-1
例如,如果您的最后一个项目进入视图(或需要绑定)请求服务器更多项目,您可以更多地加载。请记住,你必须持有一个布尔值,以防止重复调用你的getData
。