0

0

如何在 Android ListView 最后一项下方固定显示 AdView

碧海醫心

碧海醫心

发布时间:2026-02-16 13:42:10

|

453人浏览过

|

来源于php中文网

原创

如何在 Android ListView 最后一项下方固定显示 AdView

本文介绍如何通过重构布局结构,使 google admob 的 adview 始终稳定显示在 listview 所有数据项的正下方(而非屏幕底部),解决因 coordinatorlayout 与 constraintlayout 嵌套不当导致的约束失效问题。

本文介绍如何通过重构布局结构,使 google admob 的 adview 始终稳定显示在 listview 所有数据项的正下方(而非屏幕底部),解决因 coordinatorlayout 与 constraintlayout 嵌套不当导致的约束失效问题。

在 Android 开发中,将广告视图(如 AdView)精准定位在 ListView 内容末尾(即最后一条数据项之后、滚动容器底部之前)是一个常见但易出错的需求。许多开发者尝试直接在 CoordinatorLayout 或嵌套 ConstraintLayout 中使用 app:layout_constraintBottom_toTopOf="@+id/adView" 约束 ListView,却发现广告始终贴底或不随列表内容动态调整——根本原因在于:ListView 的 android:layout_height="wrap_content" 在 CoordinatorLayout 或 ViewPager 的滚动行为下实际失效,系统无法准确测量其真实高度,导致约束计算失败。

✅ 正确方案:分离广告层级,脱离滚动容器

核心思路是将 AdView 移出 CoordinatorLayout 的子树,使其成为根布局(ConstraintLayout)的直系子 View,并通过约束明确绑定到 CoordinatorLayout 底部 —— 这样 AdView 不再受 AppBar 滚动、ViewPager 行为或 ListView 高度测量异常的影响,同时又能逻辑上“位于列表之后”。

Cleanup.pictures
Cleanup.pictures

智能移除图片中的物体、文本、污迹、人物或任何不想要的东西

下载

以下是优化后的完整 activity_results.xml 推荐写法:

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout 
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:ads="http://schemas.android.com/apk/res-auto"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.test.test.ResultsActivity">

    <!-- CoordinatorLayout 负责 AppBar + ViewPager + 列表容器 -->
    <androidx.coordinatorlayout.widget.CoordinatorLayout
        android:id="@+id/coordinatorLayout"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintBottom_toTopOf="@+id/adView"> <!-- 关键:约束其底部到 adView 顶部 -->

        <com.google.android.material.appbar.AppBarLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:theme="@style/AppTheme.AppBarOverlay">

            <androidx.appcompat.widget.Toolbar
                android:id="@+id/toolbar"
                android:layout_width="match_parent"
                android:layout_height="?attr/actionBarSize"
                android:background="?attr/colorPrimary"
                app:popupTheme="@style/AppTheme.PopupOverlay"
                app:titleTextAppearance="@style/ToolbarTitle" />

            <com.google.android.material.tabs.TabLayout
                android:id="@+id/tabs"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                app:tabMaxWidth="0dp">

                <com.google.android.material.tabs.TabItem
                    android:text="@string/tab_text_1" />
                <com.google.android.material.tabs.TabItem
                    android:text="@string/tab_text_2" />
            </com.google.android.material.tabs.TabLayout>
        </com.google.android.material.appbar.AppBarLayout>

        <androidx.viewpager.widget.ViewPager
            android:id="@+id/container"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            app:layout_behavior="@string/appbar_scrolling_view_behavior" />

        <!-- 列表容器:使用 ConstraintLayout 作为 ViewPager 的页面内容 -->
        <androidx.constraintlayout.widget.ConstraintLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            app:layout_behavior="@string/appbar_scrolling_view_behavior">

            <ListView
                android:id="@+id/listView"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:clipToPadding="false"
                android:paddingBottom="16dp" <!-- 可选:为广告预留视觉间距 -->
                app:layout_constraintTop_toTopOf="parent"
                app:layout_constraintBottom_toBottomOf="parent" />
        </androidx.constraintlayout.widget.ConstraintLayout>
    </androidx.coordinatorlayout.widget.CoordinatorLayout>

    <!-- ✅ AdView 独立于 CoordinatorLayout,直接锚定在根布局底部 -->
    <com.google.android.gms.ads.AdView
        android:id="@+id/adView"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        ads:adSize="SMART_BANNER"
        ads:adUnitId="@string/banner_ad_unit_id"
        app:layout_constraintBottom_toBottomOf="parent" />

</androidx.constraintlayout.widget.ConstraintLayout>

⚠️ 关键注意事项

  • 勿在 CoordinatorLayout 内部嵌套 ConstraintLayout 并对 AdView 施加约束:原布局中 AdView 被包裹在 CoordinatorLayout 内部的 ConstraintLayout 中,此时 app:layout_constraintBottom_toTopOf 对 ListView 无效,因为 ListView 高度不可靠,且 CoordinatorLayout 不支持子 View 的 wrap_content 高度约束。
  • ListView 不再需要 app:layout_constraintBottom_toTopOf:它现在由父 ConstraintLayout 容器撑满可用高度(0dp + 上下约束),而 CoordinatorLayout 的高度则由 app:layout_constraintBottom_toTopOf="@+id/adView" 动态决定,形成清晰的层级依赖。
  • 适配 RecyclerView 更推荐:ListView 已属旧式组件;若项目允许,建议迁移到 RecyclerView 并使用 ConcatAdapter 或 FooterAdapter 添加广告项,语义更清晰、性能更优、兼容性更好。
  • 务必初始化广告:在 Activity/Fragment 中调用 MobileAds.initialize(),并在 AdView.loadAd() 前检查网络状态与权限(INTERNET, ACCESS_NETWORK_STATE)。

✅ 总结

要让 AdView 稳定显示在 ListView 内容末尾,关键不是“约束它到列表底部”,而是重构布局层级,使广告脱离滚动容器,由根布局统一管理位置。本方案通过 ConstraintLayout 作为根容器,将 CoordinatorLayout 和 AdView 设为同级兄弟节点,并利用约束链明确高度关系,彻底规避了 ListView 高度测量失效带来的定位漂移问题。简洁、可靠、符合 Material Design 布局规范。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
pdf怎么转换成xml格式
pdf怎么转换成xml格式

将 pdf 转换为 xml 的方法:1. 使用在线转换器;2. 使用桌面软件(如 adobe acrobat、itext);3. 使用命令行工具(如 pdftoxml)。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

1927

2024.04.01

xml怎么变成word
xml怎么变成word

步骤:1. 导入 xml 文件;2. 选择 xml 结构;3. 映射 xml 元素到 word 元素;4. 生成 word 文档。提示:确保 xml 文件结构良好,并预览 word 文档以验证转换是否成功。想了解更多xml的相关内容,可以阅读本专题下面的文章。

2104

2024.08.01

xml是什么格式的文件
xml是什么格式的文件

xml是一种纯文本格式的文件。xml指的是可扩展标记语言,标准通用标记语言的子集,是一种用于标记电子文件使其具有结构性的标记语言。想了解更多相关的内容,可阅读本专题下面的相关文章。

1123

2024.11.28

android开发三大框架
android开发三大框架

android开发三大框架是XUtil框架、volley框架、ImageLoader框架。本专题为大家提供android开发三大框架相关的各种文章、以及下载和课程。

315

2023.08.14

android是什么系统
android是什么系统

Android是一种功能强大、灵活可定制、应用丰富、多任务处理能力强、兼容性好、网络连接能力强的操作系统。本专题为大家提供android相关的文章、下载、课程内容,供大家免费下载体验。

1790

2023.08.22

android权限限制怎么解开
android权限限制怎么解开

android权限限制可以使用Root权限、第三方权限管理应用程序、ADB命令和Xposed框架解开。详细介绍:1、Root权限,通过获取Root权限,用户可以解锁所有权限,并对系统进行自定义和修改;2、第三方权限管理应用程序,用户可以轻松地控制和管理应用程序的权限;3、ADB命令,用户可以在设备上执行各种操作,包括解锁权限;4、Xposed框架,用户可以在不修改系统文件的情况下修改应用程序的行为和权限。

2085

2023.09.19

android重启应用的方法有哪些
android重启应用的方法有哪些

android重启应用有通过Intent、PendingIntent、系统服务、Runtime等方法。本专题为大家提供Android相关的文章、下载、课程内容,供大家免费下载体验。

279

2023.10.18

Android语音播放功能实现方法
Android语音播放功能实现方法

实现方法有使用MediaPlayer实现、使用SoundPool实现两种。可以根据具体的需求选择适合的方法进行实现。想了解更多语音播放的相关内容,可以阅读本专题下面的文章。

375

2024.03.01

pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法
pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法

本专题系统整理pixiv网页版官网入口及登录访问方式,涵盖官网登录页面直达路径、在线阅读入口及快速进入方法说明,帮助用户高效找到pixiv官方网站,实现便捷、安全的网页端浏览与账号登录体验。

283

2026.02.13

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Excel 教程
Excel 教程

共162课时 | 17.5万人学习

Java 教程
Java 教程

共578课时 | 66.6万人学习

Uniapp从零开始实现新闻资讯应用
Uniapp从零开始实现新闻资讯应用

共64课时 | 6.8万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号