说一说ListView(一)

本文探讨了解决Android中ListView与ScrollView冲突的两种方法,并详细介绍了如何通过动态设置ListView高度来避免这一问题。此外,还深入讲解了实现ListView上拉加载更多功能的具体步骤,包括监听滚动状态和加载更多数据的逻辑。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值