Android-制作一个包含可滚动列表视图的LinearLayout

Android-制作一个包含可滚动列表视图的LinearLayout,android,listview,scrollview,android-linearlayout,Android,Listview,Scrollview,Android Linearlayout,我知道每个人都建议我们不要同时使用ListView和ScrollView,我完全同意。然而,我目前只能使用一个非常简单的模式,比如8tracks的个人资料页面(如下图所示),其中包括一个用户个人资料区域和他们制作的混音列表。因此,基本上,用户只需向下滚动该页面就可以了,这意味着配置文件部分将出现在屏幕顶部并逐渐消失,同时下面的列表也会滚动: 然而,目前,我所能做的就是在线性布局中包含一个列表视图,就像我这里的草图一样 使用这种设计,我只能向下滚动列表,而配置文件区域保持在同一位置,这很糟糕。

我知道每个人都建议我们不要同时使用
ListView
ScrollView
,我完全同意。然而,我目前只能使用一个非常简单的模式,比如8tracks的个人资料页面(如下图所示),其中包括一个用户个人资料区域和他们制作的混音列表。因此,基本上,用户只需向下滚动该页面就可以了,这意味着配置文件部分将出现在屏幕顶部并逐渐消失,同时下面的列表也会滚动:

然而,目前,我所能做的就是在
线性布局
中包含一个
列表视图
,就像我这里的草图一样

使用这种设计,我只能向下滚动列表,而配置文件区域保持在同一位置,这很糟糕。因此,我正在寻找使整个页面可滚动的想法,而不仅仅是列表。请帮忙,谢谢


编辑:很抱歉这个误导性的问题。我的问题更复杂,因为选项卡的内容不仅仅是
ListView
——有些选项卡包含
LinearLayout
GridView
。同样,我想实现的是使整个页面可滚动,但是
ScrollView
帮不上忙,因为如果选项卡的内容是
ListView
GridView
,这些视图将被折叠,更重要的是,这违反了设计规则。

尝试在ListView上使用以下内容

listview.addHeaderView(v);
还请记住,在listview上调用setAdapter()之前必须调用此方法

listview.addHeaderView(v);

在包含用户详细信息和选项卡的线性布局中,将其作为标题添加到列表中。

您可以尝试将配置文件和选项卡设置为listview的标题,然后在按下选项卡时更新listview的内容。我不知道您是否希望在滚动时选项卡从视图中消失。

根据UI指南和最佳实践,建议不要在滚动视图中使用滚动内容,这样做可以防止滚动内容

当你放置两个scrollview时,android会搞不清楚哪个scrollview被触动了。因此,有时它无法传递触摸事件

但是,如果仍然想要实现滚动功能,可以使用特定视图的onTouch事件来管理它。您需要相应地设计布局

但即使需求迫使您进行这样的布局。试试这个

比如说案例有点像这样

  <ScrollView android:id=”@+id/parent_scroll” 
        android:layout_width=”fill_parent”
        android:layout_height=”wrap_content”
        android:layout_weight=”1″
        android:background=”@drawable/dotted_bg”
        android:focusableInTouchMode=”false”>
                    <LinearLayout   />
                    <LinearLayout   />
                    <LinearLayout  >
                    <ScrollView android:id=”@+id/child_scroll”  
                    android:layout_width=”fill_parent”
                    android:layout_height=”fill_parent”
                    android:background=”@drawable/text_box_bg”>
                <TextView android:id=”@+id/text_description”
                    android:layout_width=”fill_parent”
                    android:layout_height=”fill_parent”
                    android:textColor=”@color/gray”
                    android:textSize=”12dip”
                    android:padding=”5dip”
                    android:scrollbars=”vertical”/>
                <!–ScrollView>
              </LinearLayout>
第3步:现在为两个设置触摸侦听器。


我希望它能帮助你

我知道这已经晚了,但我现在是8tracks的开发者。您上面显示的(旧的)2.x应用程序正在重写,但我可以向您展示旧的开发人员在配置文件页面上做了什么

在开始之前,我必须说这不是最好的方法,但是8tracks应用程序(2.x)已经很旧了

所以回到代码上来…
ProfileActivity
包含一个
ProfileFragment

使用以下按钮(和配置文件图像)看到的主要布局如下:


和个人资料选项卡

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
  xmlns:android="http://schemas.android.com/apk/res/android"
  android:layout_width="match_parent"
  android:layout_height="wrap_content"
  android:visibility="gone"
  android:orientation="horizontal">

    <include
        android:id="@+id/profile_mixes_button"
        layout="@layout/profile_tab" />

    <include
        android:id="@+id/profile_followers_button"
        layout="@layout/profile_tab"  />

    <include
        android:id="@+id/profile_following_button"
        layout="@layout/profile_tab"  /> 

</LinearLayout>

正如你所见,这是一个常规布局,有三个按钮“模拟”选项卡

选项卡的内容也由ViewSwitcher指定:

<?xml version="1.0" encoding="utf-8"?>
<ViewSwitcher xmlns:android="http://schemas.android.com/apk/res/android"
              android:id="@+id/profile_view_switcher"
              android:layout_width="match_parent"
              android:layout_height="match_parent"
              android:inAnimation="@anim/fade_in_300"
              android:outAnimation="@anim/fade_out_300"
              android:background="@color/white">

<include
    android:id="@+id/profile_loading"
    layout="@layout/loading_view_full" />

<ListView
    android:id="@+id/profile_content_list"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:cacheColorHint="#00000000"
    android:divider="@null"
    android:dividerHeight="0dip"
    android:fadingEdge="none" />

</ViewSwitcher>

显示加载控制盘,然后切换到listview。没有其他可滚动的视图组

基本上就是这样

现在,如果您想让整个过程滚动,那么您需要使用一个自定义适配器并将上面的布局设置为标题(或者至少以一种巧妙的方式在适配器中使用getItemType)。这样,整个屏幕就是一个列表(包含列表中的所有优化)


我们(ab)在dev.;下的新8tracks应用程序中使用此选项。)

这对我来说有点混乱,因为不是所有的选项卡都包含listview。如果第一个选项卡有一个
线性布局
,而只有另外两个选项卡有
列表视图
,我该怎么办?谢谢你的详细回答,但我认为你误解了我的问题(可能是我的错,因为标题似乎有误导性)。我想要实现的是能够滚动整个页面,而不仅仅是页面的一部分,因此禁用父级滚动以使子级可滚动就像在线性布局中添加一个listview,这对我来说是不可取的。您到底想要实现什么?你想让你的ListView和整个布局可以滚动吗?我刚刚编辑了我的问题和标题,请检查一下。另外,如果您对更好的设计有任何建议,我将更加感激。很遗憾我从未了解这一点,所以感谢您的启发。但遗憾的是,这也不符合我的需要,因为实际上我的选项卡中只有一个包含ListView,而其他选项卡包含GridView和LinearView,因此我必须将它们作为片段添加到选项卡中,而不是将选项卡添加为ListView的标题。获得作者的答案真是太棒了!这太聪明了,我真的很感激。虽然我已经完成了我的项目(通过放弃使用标题部分),但我相信这对我将来(以及其他人)会很有用!非常感谢。
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
  xmlns:android="http://schemas.android.com/apk/res/android"
  android:layout_width="match_parent"
  android:layout_height="wrap_content"
  android:visibility="gone"
  android:orientation="horizontal">

    <include
        android:id="@+id/profile_mixes_button"
        layout="@layout/profile_tab" />

    <include
        android:id="@+id/profile_followers_button"
        layout="@layout/profile_tab"  />

    <include
        android:id="@+id/profile_following_button"
        layout="@layout/profile_tab"  /> 

</LinearLayout>
<?xml version="1.0" encoding="utf-8"?>
<ViewSwitcher xmlns:android="http://schemas.android.com/apk/res/android"
              android:id="@+id/profile_view_switcher"
              android:layout_width="match_parent"
              android:layout_height="match_parent"
              android:inAnimation="@anim/fade_in_300"
              android:outAnimation="@anim/fade_out_300"
              android:background="@color/white">

<include
    android:id="@+id/profile_loading"
    layout="@layout/loading_view_full" />

<ListView
    android:id="@+id/profile_content_list"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:cacheColorHint="#00000000"
    android:divider="@null"
    android:dividerHeight="0dip"
    android:fadingEdge="none" />

</ViewSwitcher>