StaggeredGrid RecyclerView を Endless および SwipeRefreshLayout と組み合わせてみました。しかし、私は自分のコードに問題があります:
grid.addOnScrollListener(new RecyclerView.OnScrollListener() {
@Override
public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
super.onScrolled(recyclerView, dx, dy);
int visibleItemCount = grid.getChildCount();
int totalItemCount = mLayoutManager.getItemCount();
int firstVisibleItem = mLayoutManager.findFirstVisibleItemPositions(null)[0];
if (firstVisibleItem == 0 && visibleItemCount > 0
&& grid.getChildAt(0).getTop() >= 0) {
mSwipeRefreshLayout.setEnabled(true);
} else {
mSwipeRefreshLayout.setEnabled(false);
}
mPreviousVisibleItem = firstVisibleItem;
if (firstVisibleItem + visibleItemCount == totalItemCount
&& totalItemCount != 0
&& isFinishLoadingAwal
&& !isFinishMoreNews
&& adapter.getItemCount() > 0) {
getMoreNewsFromServer();
}
}
});
上記のコード、問題が発生します:
エンドレス位置で、
getMoreNewsFromServer();
常に呼び出されます (通常: 1 つ呼び出されます)。無限の位置で、mSwipeRefreshLayout が呼び出されます
リストビューを使用した場合、次のように機能します:
list.setOnScrollListener(new AbsListView.OnScrollListener() {
@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {
}
@Override
public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
if (firstVisibleItem == 0 && visibleItemCount > 0
&& list.getChildAt(0).getTop() >= 0) {
mSwipeRefreshLayout.setEnabled(true);
} else {
mSwipeRefreshLayout.setEnabled(false);
}
mPreviousVisibleItem = firstVisibleItem;
if (firstVisibleItem + visibleItemCount == totalItemCount
&& totalItemCount != 0
&& isFinishLoadingAwal
&& !isFinishMoreNews
&& adapter.getCount() > 0) {
getMoreNewsFromServer();
}
}
});
それで、それを修正する方法は?