ListView作为一个烂大街的Android控件(一句调侃,哈哈),我们今天简单来总结下。当然了,它的被使用程度以及重要性自然也是不言而喻的。
一、首先来介绍下一个很常见的问题:ScrollView和ListView的冲突。
解决这个冲突,我们有两种方法:自定义ListView、动态设置ListView的高度。
方法一:自定义ListView,实现起来很简单,仅需一处改动。
这里我们主要来讲一下方法二:动态设置ListVie的高度。直接上源码:
/**
* 动态设置ListView的高度
* @param listView
*/
public static void setListViewHeight(ListView listView) {
ListAdapter listAdapter = listView.getAdapter();
if (listAdapter == null) {
return;
}
int totalHeight = 0;
for (int i = 0; i < listAdapter.getCount(); i++) {
View listItem = listAdapter.getView(i, null, listView);
listItem.measure(0, 0);
totalHeight += listItem.getMeasuredHeight();
}
ViewGroup.LayoutParams params = listView.getLayoutParams();
params.height = totalHeight + (listView.getDividerHeight() * (listAdapter.getCount() - 1));
listView.setLayoutParams(params);
}
注:使用方法二,ListView的item布局的根元素必须为LinearLayout。
二、ListView的上拉加载。
实现AbsListView.OnScrollListener接口即可,紧接着重写onScrollStateChanged方法和onScroll方法。示例如下:
@Override
public void onScroll(AbsListView absListView, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
switch (absListView.getId()) {
case R.id.lv_other_report:
otherReportLastIndex = firstVisibleItem + visibleItemCount;
otherReportTotalIndex = totalItemCount;
break;
case R.id.lv_real_time_report:
realTimeReportLastIndex = firstVisibleItem + visibleItemCount;
realTimeReportTotalIndex = totalItemCount;
break;
}
}
@Override
public void onScrollStateChanged(AbsListView absListView, int scrollState) {
switch (absListView.getId()) {
case R.id.lv_other_report:
if (otherReportLastIndex == otherReportTotalIndex && (scrollState == SCROLL_STATE_IDLE)) {
if (!isOtherReportEnd) {
if (isReportLoading) {
new HintUtils().showTopToast(getActivity(), "正在加载...");
} else {
relative_footer_other_report.setVisibility(View.VISIBLE);
isReportLoading = true;
isDefaultLoad = false;
isOtherReportLoadMore = true;
loadingPatrolReport = true;
otherReportLimitBegin += otherReportLimit;
new GetPatrolReportThread(handler, null, null, null, null, null, otherReportLimitBegin + "", otherReportLimit + "", false).start();
}
}
}
break;
case R.id.lv_real_time_report:
if (realTimeReportLastIndex == realTimeReportTotalIndex && (scrollState == SCROLL_STATE_IDLE)) {
if (!isRealTimeReportEnd) {
if (isReportLoading) {
new HintUtils().showTopToast(getActivity(), "正在加载...");
} else {
relative_footer_real_time_report.setVisibility(View.VISIBLE);
isReportLoading = true;
isDefaultLoad = false;
isRealTimeReportLoadMore = true;
realTimeReportLimitBegin += realTimeReportLimit;
new GetRealTimeReportThread(getRealTimeReportHandler, null, null, null, null, null, realTimeReportLimitBegin + "", realTimeReportLimit + "", false).start();
}
}
}
break;
}
}