android 在自定义的listview(有刷新加载项)列表中,数据过少时不能铺满整个屏幕时,header和footer同时显示问题
android 在自定义的listview(有刷新加载项)列表中,数据过少时,当刷新时,加载项也会显示,这是很头疼的一个问题,查阅了一些资料,总结了一个比较不错的方法:
原来代码:
1 @Override 2 public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) { 3 this.firstVisibleItem = firstVisibleItem; 4 this.lastVisibleItem = firstVisibleItem + visibleItemCount; 5 this.totalItemCount = totalItemCount; 6 } 7 8 @Override 9 public void onScrollStateChanged(AbsListView view, int scrollState) { 10 this.scrollState = scrollState; 11 12 if (totalItemCount == lastVisibleItem&& scrollState == SCROLL_STATE_IDLE) { 13 if (!isLoading) { 14 isLoading = true; 15 footer.findViewById(R.id.load_layout).setVisibility(View.VISIBLE); 16 // 加载更多 17 iLoadListener.onLoad(); 18 } 19 } 20 21 }
通常大家通过这种方法来判断是否应该显示加载并访问网络数据等,但是当数据不足以布满全部时,下拉刷新后,(因满足条件)会同时触发加载事件,想要不触发加载事件,只有改变触发条件,一种思想是判断数据是否过少不能布满屏幕,但是这种思想太难用代码实现(小生刚刚学习android,经验不足),另一种思想是因为在刷新时不能显示加载布局,我们可以判断当前是否处于刷新状态来判断因不应该显示加载布局,而判断是否处于刷新状态我们可以利用header.getPaddingTop() == -headerHeight(headerHeight是hreader的高度)判断
请看代码
1 @Override 2 public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) { 3 this.firstVisibleItem = firstVisibleItem; 4 this.lastVisibleItem = firstVisibleItem + visibleItemCount; 5 this.totalItemCount = totalItemCount; 6 } 7 8 @Override 9 public void onScrollStateChanged(AbsListView view, int scrollState) { 10 this.scrollState = scrollState; 11 if (header.getPaddingTop() == -headerHeight) { 12 flag = true; 13 } else { 14 flag = false; 15 } 16 if (totalItemCount == lastVisibleItem && flag && scrollState == SCROLL_STATE_IDLE) { 17 if (!isLoading) { 18 isLoading = true; 19 footer.findViewById(R.id.load_layout).setVisibility(View.VISIBLE); 20 // 加载更多 21 iLoadListener.onLoad(); 22 } 23 } 24 25 }
定义一个私有布尔变量flag,当header.getPaddingTop() == -headerHeight时,当前不在刷新状态,flag=true,满足显示加载布局的一个条件。
当处于刷新状态时,flag=false,不满足加载条件,所以解决了同时出现两个布局的问题。
当然,大神们会有更好的办法。。本菜鸟只能想到这么多了,谢谢。。。。。。