第一次使用 3 个跨度的 GridLayoutManager 在 RecyclerView 中加载超过 10 个项目
Load more than 10 items in RecyclerView with GridLayoutManager of 3 span count on first time
我在我的应用程序的 recyclerView 中使用具有 3 个跨度计数的 GridLayoutManager,问题是当我 运行 应用程序第一次显示时,由于来自服务器的项目的限制/分页,它只显示前 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.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
.
我在我的应用程序的 recyclerView 中使用具有 3 个跨度计数的 GridLayoutManager,问题是当我 运行 应用程序第一次显示时,由于来自服务器的项目的限制/分页,它只显示前 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.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
.