我有一个网格视图,希望在到达列表结束后更新网格视图中的项。为了实现这一点,我决定使用OnScrollListener。但是OnScrollListener的行为很奇怪,因为它多次调用我的方法更新网格视图。
@Override
public void onScroll(AbsListView view, int firstVisibleItem,
int visibleItemCount, int totalItemCount) {
// TODO Auto-generated method stub
if (firstVisibleItem + visibleItemCount >= totalItemCount) {
// End has been reached
// Call method to update
Log.i("CountShit", String.valueOf(firstVisibleItem) + " + "
+ String.valueOf(visibleItemCount) + " >= "
+ String.valueOf(totalItemCount));
}
}
});在我的日志中,当onScrollListener继续侦听卷轴时,if条件times被多次调用。
09-29 14:06:10.338: I/CountShit(23640): 12 + 8 >= 20
09-29 14:06:10.353: I/CountShit(23640): 12 + 8 >= 20
09-29 14:06:10.369: I/CountShit(23640): 12 + 8 >= 20
09-29 14:06:10.385: I/CountShit(23640): 12 + 8 >= 20
09-29 14:06:10.400: I/CountShit(23640): 12 + 8 >= 20
09-29 14:06:10.424: I/CountShit(23640): 14 + 6 >= 20
09-29 14:06:10.439: I/CountShit(23640): 14 + 6 >= 20
09-29 14:06:10.455: I/CountShit(23640): 14 + 6 >= 20
09-29 14:06:10.470: I/CountShit(23640): 14 + 6 >= 20
09-29 14:06:10.486: I/CountShit(23640): 14 + 6 >= 20如果我第一次到达列表的末尾,我的upate方法会被调用..然后,如果用户向上或向下滚动或其他任何方法,不应再次调用!(当然,直到我到达更新列表的末尾为止)。
发布于 2014-09-29 09:17:24
我可以通过增加一些变量来解决这个问题。
private int previousTotal = 0;
private boolean loading = true;
private int visibleThreshold = 5;并检查以下条件..。
public void onScroll(AbsListView view, int firstVisibleItem,
int visibleItemCount, int totalItemCount) {
// TODO Auto-generated method stub
if (loading) {
if (totalItemCount > previousTotal) {
loading = false;
previousTotal = totalItemCount;
pageCount++;
}
}
if (!loading
&& (totalItemCount - visibleItemCount) <= (firstVisibleItem + visibleThreshold)) {
// End has been reached
Log.i("CountShit", String.valueOf(firstVisibleItem) + " + "
+ String.valueOf(visibleItemCount) + " >= "
+ String.valueOf(totalItemCount));
// call update method here
loading = true;
}
}
});发布于 2014-09-29 08:54:09
totalDataCount ->变量,它存储api获取的数据的总数。
previousTotal ->变量,它存储以前的总数。默认情况下,它被设置为零。
默认情况下,将 ->布尔值设置为false。
在活动中而不是在内部类中声明所有这些变量(下面)
此代码将在下面工作:-
public class EndlessScrollListenerUser implements OnScrollListener {
boolean loading = true;
public EndlessScrollListenerUser() {}
@Override
public void onScroll(AbsListView view, int firstVisibleItem,
int visibleItemCount, int totalItemCount) {
int lastInScreen = firstVisibleItem + visibleItemCount;
if (loading) {
if (totalItemCount > previousTotal) {
loading = false;
previousTotal = totalItemCount;
}
}
if (!loading && lastInScreen==totalItemCount && totalDataCount>takeUser && (previousTotal)<totalDataCount) {
// Your API Call Goes Here after reaching end
loading = true;
}
}
@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {}
}https://stackoverflow.com/questions/26095857
复制相似问题