ScrollView 中的 ListViews 与我的 TextViews 重叠

Posted

技术标签:

【中文标题】ScrollView 中的 ListViews 与我的 TextViews 重叠【英文标题】:ListViews within ScrollView overlaps my TextViews 【发布时间】:2015-10-10 00:55:01 【问题描述】:

我已经看到了很多与我相关的问题,但是,这些都没有奏效。我目前正在设计一个视图,其中一个 ScrollView 中有四个 ListView,我想让整个 ScrollView 滚动,同时显示 ListView 中的所有项目。那没问题;但是,对于不同的列表视图,列表视图一直与我的标题文本重叠。

我已经尝试了边距和填充;谁都没有工作。我还尝试将 scrollLayout 重新制作为 LinearLayout。我还尝试将文本放在单独的 LinearLayouts 中,与 ListViews 分开,但这也不起作用。

下面是我的源代码。有谁知道如何使文本不与 listViews 中的 Top 项目重叠?顺便说一句,上面的“***结果”工作得很好。

<ScrollView
    android:layout_
    android:layout_
    android:id="@+id/scrollView"
    android:layout_alignParentTop="true">
    <RelativeLayout
        android:layout_
        android:layout_
        android:id="@+id/scrollLayout">

        <RelativeLayout
            android:layout_
            android:layout_
            android:layout_alignParentTop="true"
            android:layout_centerHorizontal="true"
            android:id="@+id/topResultLayout">

            <TextView
                android:layout_
                android:layout_
                android:id="@+id/topResultTitle"
                android:textSize="20sp"
                android:textIsSelectable="false"
                android:layout_alignParentStart="true"
                android:layout_alignParentLeft="true"
                android:layout_alignParentTop="true"
                android:textColor="#000000" />

            <ListView
                android:layout_
                android:layout_
                android:id="@+id/topResultList"
                android:layout_below="@id/topResultTitle"/>

        </RelativeLayout>

        <RelativeLayout
            android:layout_
            android:layout_

            android:layout_centerHorizontal="true"
            android:id="@+id/streamResultLayout"
            android:layout_below="@id/topResultLayout">

            <TextView
                android:layout_
                android:layout_
                android:id="@+id/streamResultTitle"
                android:textSize="20sp"
                android:textIsSelectable="false"
                android:layout_alignParentStart="true"
                android:layout_alignParentLeft="true"
                android:layout_alignParentTop="true"
                android:textColor="#000000" />

            <TextView
                android:layout_
                android:layout_
                android:id="@+id/seeAllStreams"
                android:layout_alignParentEnd="true"
                android:layout_alignParentRight="true"
                android:layout_alignParentTop="true"
                android:textColor="#000000"
                android:textSize="14sp"
                android:layout_above="@+id/streamResultList" />





            <ListView
                android:layout_
                android:layout_
                android:id="@+id/streamResultList"
                android:layout_below="@id/streamResultTitle"/>
        </RelativeLayout>

        <RelativeLayout
            android:layout_
            android:layout_

            android:layout_centerHorizontal="true"
            android:id="@+id/broadcasterResultLayout"
            android:layout_below="@id/streamResultLayout">

            <TextView
                android:layout_
                android:layout_
                android:id="@+id/broadcasterResultTitle"
                android:layout_alignParentStart="true"
                android:layout_alignParentLeft="true"
                android:layout_alignParentTop="true"
                android:textSize="20sp"
                android:textIsSelectable="false"

                android:textColor="#000000" />

            <TextView
                android:layout_
                android:layout_
                android:id="@+id/seeAllBroadcasters"
                android:layout_alignParentEnd="true"
                android:layout_alignParentRight="true"
                android:layout_alignParentTop="true"

                android:textColor="#000000"
                android:textSize="14sp" />




            <ListView
                android:layout_
                android:layout_
                android:id="@+id/broadcasterResultList"
                android:layout_below="@id/broadcasterResultTitle"/>
        </RelativeLayout>

        <RelativeLayout
            android:layout_
            android:layout_

            android:layout_centerHorizontal="true"
            android:id="@+id/tagResultLayout"
            android:layout_below="@id/broadcasterResultLayout"
            android:layout_alignParentBottom="true">

            <TextView
                android:layout_
                android:layout_
                android:id="@+id/tagResultTitle"
                android:layout_alignParentStart="true"
                android:layout_alignParentLeft="true"
                android:layout_alignParentTop="true"
                android:textSize="20sp"
                android:textIsSelectable="false"
                android:textColor="#000000" />

            <TextView
                android:layout_
                android:layout_
                android:id="@+id/seeAllTags"
                android:layout_alignParentEnd="true"
                android:layout_alignParentRight="true"
                android:layout_alignParentTop="true"
                android:textColor="#000000"
                android:textSize="14sp" />




            <ListView
                android:layout_
                android:layout_
                android:id="@+id/tagResultList"
                android:layout_below="@id/tagResultTitle"/>
        </RelativeLayout>
    </RelativeLayout>
</ScrollView>

【问题讨论】:

切勿在 ScrollView 内使用 ListView,反之亦然 listview 本身就是一个滚动视图 我认为 xml 看起来不错,你用什么来扩展它?我使用下面的代码。 【参考方案1】:
public static void setListViewHeightBasedOnChildren(ListView listView, ListAdapter adapter)
    
        ListAdapter listAdapter = adapter;

        if (listAdapter == null) 
            return;
        

        int desiredWidth = View.MeasureSpec.makeMeasureSpec(listView.getWidth(), View.MeasureSpec.UNSPECIFIED);
        int totalHeight = 0;
        View view = null;
        for (int i = 0; i < listAdapter.getCount(); i++) 
            view = listAdapter.getView(i, view, listView);
            if (i == 0) 
                view.setLayoutParams(new ViewGroup.LayoutParams(desiredWidth, ViewGroup.LayoutParams.WRAP_CONTENT));
            
            view.measure(desiredWidth, View.MeasureSpec.UNSPECIFIED);
            totalHeight += view.getMeasuredHeight();
        
        ViewGroup.LayoutParams params = listView.getLayoutParams();
        params.height = totalHeight;
        listView.setLayoutParams(params);
        listView.requestLayout();
    

【讨论】:

谢谢,这确实很有魅力。不过还是有些问题。它只显示第一个 ListView 的三项之一,即 streamResultList。你可能知道是什么原因造成的吗?另外,最后一个仍然不起作用,所以我添加了一个 20dp 的填充顶部,并且 tagResultLayout 中的 TextViews 和 ListView 分离了。但是,tagResultList 中最后一项的一小部分消失了。我可以在您的函数的 ListView 中添加一些空间吗?也许在循环中,比如 if (i == listAdapter.getCount()) ? 我现在解决了第一个问题,所以我看到了所有的流。但是,单击最后一节中的 seeAll 仍然不起作用。不幸的是,填充使得无法单击它,即使填充修复了布局问题。你知道怎么解决吗?非常感谢您的帮助!

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

ScrollView 允许拖动内容。这怎么能被禁用?

ScrollView 内不可滚动的 ListView

嵌套的 ListViews 没有扩展到全高

ListView Flutter 中的 ListViews

在RecyclerView中显示ListViews中的项目

多个ListViews在android中以编程方式创建