说一说ListView(一)

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;
        }
    }

猜你喜欢

转载自blog.csdn.net/zdj_Develop/article/details/81319884