讲师中心 微信公众号
AI工具推荐 视频效率加速

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

冬磊君_5560

冬磊君_5560

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

|

473人浏览过

|

来源于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 高度测量异常的影响,同时又能逻辑上“位于列表之后”。

Android SMS Gateway
Android SMS Gateway

自托管短信服务,使用 Android 手机作为网关提供 HTTP API,支持发送/接收短信,兼容主流短信网关。

下载

以下是优化后的完整 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工具

更多
SkildArt
SkildArt Hot

SkildArt是一款AI文本写作工具,一站式 AI 视觉创作平台。

超级简历WonderCV

一款AI办公效率工具,主要用于免费求职简历模版下载制作,应届生职场人必备简历制作神器,适合需要提升相关任务效率的用户。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

立刻MV
立刻MV Hot

立刻MV是一款AI文本写作工具,AI 音乐视频(MV)创作工具。

蛙蛙写作

一款AI论文写作工具,主要用于超级AI智能写作助手,适合需要提升相关任务效率的用户。

UpDream
UpDream Hot

一款AI视频创作工具,主要用于哔哩哔哩推出的自研AI视频创作工具,适合需要提升相关任务效率的用户。

咔片AIPPT

一款在线AI演示文稿制作工具,可根据主题和内容需求辅助生成PPT结构与页面,提高演示材料制作效率。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

相关专题

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

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

4884

2024.04.01

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

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

6337

2024.08.01

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

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

2562

2024.11.28

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

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

922

2023.08.14

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

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

2747

2023.08.22

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

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

5457

2023.09.19

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

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

705

2023.10.18

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

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

964

2024.03.01

Uvicorn 报错与问题解决教程
Uvicorn 报错与问题解决教程

本专题汇总了Uvicorn服务器常见问题与报错解决的教程合集,涵盖启动失败、端口占用、模块导入错误、事件循环冲突及热重载失效等典型故障的排查思路。同时整理了多进程与Worker配置、SSL/HTTPS证书报错、跨域与代理配置等实战解决方案,助你快速定位并解决Uvicorn运行中的各类问题。

0

2026.11.02

热门下载

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

精品课程

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

共162课时 | 45.1万人学习

Java 教程
Java 教程

共578课时 | 195.6万人学习

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

共64课时 | 9.7万人学习

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

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn