我知道每个人都建议我们永远不要同时使用ListView
和ScrollView
,我完全同意。但是,我目前仍然使用一个非常简单的模式,如8tracks的个人资料页面(如下图所示),其中包括用户个人资料的区域和他们制作的混音列表。所以基本上,用户可以向下滚动该页面,这意味着配置文件部分将位于屏幕顶部并逐渐退出视图,同时下面的列表也会滚动:
但是,目前我所能做的就是在ListView
中加入LinearLayout
,就像我的草图一样。
通过这种设计,我只能向下滚动列表,而配置文件区域保持在相同的位置,这很糟糕。所以我正在寻找任何想法使整个页面可滚动,而不仅仅是列表。请帮助和谢谢。
已编辑:对于这个误导性问题,我很抱歉。我的问题更加复杂,因为标签的内容不只是ListView
- 有些标签包含LinearLayout
或GridView
。同样,我想要实现的是使整个页面可滚动,但ScrollView
无法帮助,因为如果选项卡的内容是ListView
或GridView
,这些视图将是崩溃,更重要的是 - 这违反了设计规则。
答案 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; } });
我希望它会对你有所帮助。