OnScrollListener更新GridView
我有一个网格视图,并希望在列表结束后更新网格视图中的项目。为了实现这个,我决定使用OnScrollListener。但OnScrollListener的行为很奇怪,因为它叫我的方法来更新网格视图多次..OnScrollListener更新GridView
@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));
}
}
});
,并在我的日志中,如果conditioin被称为多次作为onScrollListener不断听滚动我想..
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方法被称为..然后当用户向上或向下滚动或任何方法不应再次呼吁! (直到我到达我更新的课程列表的末尾)。
我能够通过增加一些变量来解决这个问题
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;
}
}
});
totalDataCount - >变量存储数据的总数你的API可以让你
previousTotal - >变量,它存储先前总数。默认情况下它被设置为零。
loading - >布尔值默认设置为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) {}
}
谢谢!你的答案非常有帮助 – 2014-09-29 09:19:10
@rogerthatcode - 请接受我的回答。 – 2014-09-29 09:32:55
您正在寻找无尽的视图。您必须创建一个无限滚动监听器并将其应用于GridView。尝试下面的代码;
初始化GridView和应用适配器
final GridView g = (GridView) findViewById(R.id.myGrid);
g.setAdapter(new ImageAdapter(this));
EndlessScrollListener scrollListener=new EndlessScrollListener(g,new RefreshList() {
@Override
public void onRefresh(int pageNumber) {
System.out.println("On Refresh invoked..");
}
});
g.setOnScrollListener(scrollListener);
EndlessScrollListener
public class EndlessScrollListener implements OnScrollListener {
private GridView gridView;
private boolean isLoading;
private boolean hasMorePages;
private int pageNumber=0;
private RefreshList refreshList;
private boolean isRefreshing;
public EndlessScrollListener(GridView gridView,RefreshList refreshList) {
this.gridView = gridView;
this.isLoading = false;
this.hasMorePages = true;
this.refreshList=refreshList;
}
@Override
public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
if (gridView.getLastVisiblePosition() + 1 == totalItemCount && !isLoading) {
isLoading = true;
if (hasMorePages&&!isRefreshing) {
isRefreshing=true;
refreshList.onRefresh(pageNumber);
}
} else {
isLoading = false;
}
}
@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {
}
public void noMorePages() {
this.hasMorePages = false;
}
public void notifyMorePages(){
isRefreshing=false;
pageNumber=pageNumber+1;
}
public interface RefreshList {
public void onRefresh(int pageNumber);
}
}
嗨,我想你已经从这里复制这段代码:http://*.com/questions/10923034/endless-gridview – 2014-09-29 08:56:53
谢谢,我正在寻找这个链接,但无法找到,所以从我的项目中复制代码和粘贴在这里。现在我可以在我的答案中更新链接。 – 2014-09-29 08:59:49
谢谢你们,我解决了它:D – 2014-09-29 09:19:38
检查:https://github.com/thecodepath/android_guides/wiki/Endless-Scrolling-with-AdapterViews – 2014-09-29 08:57:17