Android - 创建一个包含ListView可滚动的LinearLayout

时间:2013-05-02 04:20:47

标签: android listview scrollview android-linearlayout

我知道每个人都建议我们永远不要同时使用ListViewScrollView,我完全同意。但是,我目前仍然使用一个非常简单的模式,如8tracks的个人资料页面(如下图所示),其中包括用户个人资料的区域和他们制作的混音列表。所以基本上,用户可以向下滚动该页面,这意味着配置文件部分将位于屏幕顶部并逐渐退出视图,同时下面的列表也会滚动:

enter image description here

但是,目前我所能做的就是在ListView中加入LinearLayout,就像我的草图一样。

enter image description here

通过这种设计,我只能向下滚动列表,而配置文件区域保持在相同的位置,这很糟糕。所以我正在寻找任何想法使整个页面可滚动,而不仅仅是列表。请帮助和谢谢。

已编辑:对于这个误导性问题,我很抱歉。我的问题更加复杂,因为标签的内容不只是ListView - 有些标签包含LinearLayoutGridView。同样,我想要实现的是使整个页面可滚动,但ScrollView无法帮助,因为如果选项卡的内容是ListViewGridView,这些视图将是崩溃,更重要的是 - 这违反了设计规则。

4 个答案:

答案 0 :(得分:1)

我知道这已经很晚了,但我现在是8tracks的开发者。您上面显示的(旧)2.x应用程序正在被重写,但我可以向您展示旧开发人员为个人资料页面所做的工作。

在进入之前我必须说这不是最好的方法,但8tracks app(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="match_parent"
    android:orientation="vertical" >

    <!-- Image, name, location -->

    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal"
        android:padding="10dip" >

        <com.gdub.widget.ImageViewClickable
            android:id="@+id/dj_avatar"
            android:layout_width="110dip"
            android:layout_height="110dip"
            android:layout_marginRight="10dip"
            android:background="@drawable/default_avatar_max200"
            android:scaleType="centerCrop" />

        <com.gdub.widget.CollapsingTextView
            android:id="@+id/dj_location"
            style="@style/mix.counts"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginBottom="10dip"
            android:layout_toRightOf="@id/dj_avatar" />

        <ViewSwitcher
            android:id="@+id/profile_action_btn"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_below="@id/dj_location"
            android:layout_toRightOf="@id/dj_avatar" >

            <Button
                android:id="@+id/follow_btn"
                style="@style/white_button"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="@string/follow" />

            <Button
                android:id="@+id/edit_profile_btn"
                style="@style/white_button"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="@string/edit_profile" />
        </ViewSwitcher>
    </RelativeLayout>

    <TextView
        android:id="@+id/dj_bio"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginBottom="-25dip"
        android:gravity="left|center_vertical"
        android:lineSpacingExtra="2dip"
        android:paddingLeft="10dip"
        android:paddingRight="10dip"
        android:textColor="@color/default_text"
        android:textSize="15sp" />

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

</LinearLayout>

and profile_tabs ...

<?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>

显示加载轮然后切换到列表视图。没有其他可滚动的ViewGroup。

基本上就是这样。

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

我们(ab)在dev下的新8tracks App中使用它。 ;)

答案 1 :(得分:0)

尝试在列表视图中使用以下内容。

listview.addHeaderView(v);

另外请记住,您必须在列表视图上调用setAdapter()之前调用此方法。

将linearlayout包含在您拥有用户详细信息和标签的位置,并将其作为标题添加到列表中。

答案 2 :(得分:0)

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

答案 3 :(得分:0)

根据UI指南和最佳实践,建议不要在Scrollview中使用Scrollable内容,这样做会阻止滚动Scrollable内容。

当您放置两个scrollview android时,只会感到困惑,哪个滚动视图被触摸。所以有时它无法提供触摸事件。

但是,如果您仍想实现滚动功能,则可以使用特定视图的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>

第1步:为两个滚动视图提供唯一ID。

第2步:在您的活动中获取该两个scrollview的参考。

  parentScroll=(ScrollView)findViewById(R.id.parent_scroll);
    childScroll=(ScrollView)findViewById(R.id.child_scroll);

第3步:现在为两者设置触控侦听器。

  parentScroll.setOnTouchListener(new View.OnTouchListener() {
            public boolean onTouch(View v, MotionEvent event) {
                Log.v(TAG,”PARENT TOUCH”);
  findViewById(R.id.child_scroll).getParent().requestDisallowInterceptTouchEvent(false);
                return false;
            }
        });
        childScroll.setOnTouchListener(new View.OnTouchListener() {
            public boolean onTouch(View v, MotionEvent event) 
            {
                Log.v(TAG,”CHILD TOUCH”);
                                    // Disallow the touch request for parent scroll on touch of child view
                v.getParent().requestDisallowInterceptTouchEvent(true);
                return false;
            }
        });

我希望它会对你有所帮助。