ListView 与 CoordinatorLayout 中的 SearchView 重叠

Posted

技术标签:

【中文标题】ListView 与 CoordinatorLayout 中的 SearchView 重叠【英文标题】:A ListView overlaps a SearchView in a CoordinatorLayout 【发布时间】:2021-07-18 23:30:46 【问题描述】:

我在 androidX 迁移后修复了一个应用程序,我遇到了一个非常奇怪的错误,即我的 ListView 没有在 onCreate/onStart/onResume 事件中加载:

A ListView is not displaying any data on OnCreate/OnStart after AndroidX migration

机缘巧合,我决定“简化”我的布局并删除包含ListViewLinearLayout。在此更改之后,数据已正确加载,因为似乎 LinearLayout 以某种方式阻止了 getView 事件。但是,在此更改之后,SearchViewListView 重叠,我不知道如何将它们按正确的顺序排列(首先是SearchView,然后是ListView)。

这就是现在的样子:

这是我的代码:

other_ruins.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_
    android:layout_
    android:orientation="vertical">
    <androidx.coordinatorlayout.widget.CoordinatorLayout
        android:layout_weight="1"
        android:layout_
        android:layout_>
        <include layout="@layout/search_container" />
        <ListView
            android:id="@+id/lstOtherRuins"
            app:layout_behavior="@string/appbar_scrolling_view_behavior"
            android:nestedScrollingEnabled="true"
            android:layout_margin="8dp"
            android:layout_
            android:layout_
            android:choiceMode="singleChoice"
            android:layout_below="@id/toolbar_container"
            android:layout_gravity="left|start" />
    </androidx.coordinatorlayout.widget.CoordinatorLayout>
    <com.google.android.gms.ads.AdView
        android:id="@+id/adView"
        android:layout_
        android:layout_
        app:adSize="SMART_BANNER"
        app:adUnitId="@string/banner_ad_unit_id" />
</LinearLayout>

search_container.xml:

<?xml version="1.0" encoding="UTF-8" ?>
<FrameLayout
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/toolbar_container"
    android:theme="@style/AppTheme.AppBarOverlay"
    android:layout_
    android:layout_>

    <androidx.appcompat.widget.Toolbar
        android:id="@+id/toolbar"
        app:theme="@style/ToolBarStyle"
        android:layout_
        android:layout_
        android:background="@color/colorPrimary" />

    <com.miguelcatalan.materialsearchview.MaterialSearchView
        android:id="@+id/search_view"
        android:layout_
        android:layout_ />
</FrameLayout>

关于 search_container 我也使用AppBarLayout 进行了测试并导致应用程序崩溃;因此,这不是解决方案。

知道如何解决吗?为什么会这样?如果您知道如何解决上一个问题并以某种方式在onCreate/onStart/onResume 事件上调用getView 事件是另一种解决方案。

【问题讨论】:

只是没有注意到您在发布答案之前使用AppBarLayout 进行了测试.. 您能否显示使用时引发的崩溃报告 【参考方案1】:

您需要将search_container.xml 中的FrameLayout 替换为AppBarLayout,因为当您在CoordinatorLayout 中使用Toolbar 时,AppBarLayout 应该包裹Toolbar

<?xml version="1.0" encoding="UTF-8" ?>
<com.google.android.material.appbar.AppBarLayout
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/toolbar_container"
    android:theme="@style/AppTheme.AppBarOverlay"
    android:layout_
    android:layout_>

    <androidx.appcompat.widget.Toolbar
        android:id="@+id/toolbar"
        app:theme="@style/ToolBarStyle"
        android:layout_
        android:layout_
        android:background="@color/colorPrimary" />

    <com.miguelcatalan.materialsearchview.MaterialSearchView
        android:id="@+id/search_view"
        android:layout_
        android:layout_ />
</com.google.android.material.appbar.AppBarLayout>

【讨论】:

这是部分解决方案,但仍然给了我一些指导。您需要将两者结合起来才能使其工作。谢谢赞恩。【参考方案2】:

在我的例子中,我需要用AppBarLayout 包裹我的FrameLayout 使其正常工作,当我没有这样做时,它会复制工具栏并创建一个奇怪的阴影。这是最后的变化:

<?xml version="1.0" encoding="UTF-8" ?>
<com.google.android.material.appbar.AppBarLayout
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/toolbar_container"
    android:layout_
    android:layout_>

    <FrameLayout
        android:layout_
        android:layout_>

        <androidx.appcompat.widget.Toolbar
            android:id="@+id/toolbar"
            app:theme="@style/ToolBarStyle"
            android:layout_
            android:layout_
            android:background="@color/colorPrimary" />

        <com.miguelcatalan.materialsearchview.MaterialSearchView
            android:id="@+id/search_view"
            android:layout_
            android:layout_ />
    </FrameLayout>

</com.google.android.material.appbar.AppBarLayout>

只有其中一个会破坏应用程序。

【讨论】:

以上是关于ListView 与 CoordinatorLayout 中的 SearchView 重叠的主要内容,如果未能解决你的问题,请参考以下文章

布局与控件-ListView知多少(上)

如何得到listview的总列数与总行数

ListView,减少 ListView 中一个元素与另一个元素之间的空间

android ListView 与GridView 学习总结

与 ListView 战斗

Scrollerview与listview或者gridview发生冲突