Android滚动整个屏幕而不是仅列表视图

时间:2016-04-20 15:09:39

标签: android android-layout listview android-coordinatorlayout

我有以下布局结构:

RelativeLayout
  -LinearLayout(Vertical)
  |  ...
  |  ...
  -LinearLayout(Vertical)
     ListView

ListView有一堆由ArrayAdapter设置的项目。目前,只有ListView可滚动,第一个LinearLayout保留在其位置。但是,我希望整个屏幕可以滚动,所以如果用户滚动得足够远,ListView可能占据整个屏幕,如果有足够的列表项。

此图片说明了所需的行为(滚动之前和之后)Desired layout behaviour before and after scrolling 红色框是第一个LinearLayout,绿色框是LinearLayoutListView

感谢您的宝贵帮助!

5 个答案:

答案 0 :(得分:2)

如果您不必使用RelativeLayout,您可以使用CoordinatorLayout尝试不同的结构,如下所示:

<CoordinatorLayout >
    <AppBarLayout >
        <CollapsingToolbarLayout >
             <!-- first layout with the property layout_scrollFlags="scroll" -->
        </CollapsingToolbarLayout >
    </AppBarLayout >

    <ListView > <!-- or RecyclerView to be more updated -->
</CoordinatorLayout >

如果你必须使用RelativeLayout,你可以选择在Scrollview中实现all(执行不良并重新发明轮子),或者你可以将你的视图添加为listview的标题

-----编辑只是为了清晰起见,这是我的布局

<android.support.design.widget.CoordinatorLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:fitsSystemWindows="true"
    tools:context="it.italia.playground.CollapseActivity">

    <android.support.design.widget.AppBarLayout
        android:id="@+id/app_bar_layout"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:fitsSystemWindows="true"
        android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar">

        <android.support.design.widget.CollapsingToolbarLayout
            android:id="@+id/collapsing_toolbar"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:fitsSystemWindows="true"
            app:contentScrim="?attr/colorPrimary"
            app:expandedTitleMarginEnd="64dp"
            app:expandedTitleMarginStart="48dp"
            app:layout_scrollFlags="scroll|exitUntilCollapsed">

            <RelativeLayout
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:fitsSystemWindows="true"
                android:padding="@dimen/padding16"
                app:layout_collapseMode="parallax">

                <ImageView
                    android:id="@+id/image"
                    android:layout_width="150dp"
                    android:layout_height="150dp"
                    android:layout_alignParentTop="true"
                    android:layout_centerInParent="true"
                    android:maxHeight="@dimen/padding16"
                    android:scaleType="centerCrop"
                    android:src="@drawable/img"/>

                <TextView
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_below="@+id/image"
                    android:layout_centerInParent="true"
                    android:layout_marginTop="@dimen/padding16"
                    android:text="text title"
                    />
            </RelativeLayout>


            <android.support.v7.widget.Toolbar
                android:id="@+id/toolbar"
                android:layout_width="match_parent"
                android:layout_height="?attr/actionBarSize"
                app:layout_collapseMode="pin"
                app:popupTheme="@style/ThemeOverlay.AppCompat.Light"/>

        </android.support.design.widget.CollapsingToolbarLayout>

    </android.support.design.widget.AppBarLayout>

    <include layout="@layout/content_layout"></include>


</android.support.design.widget.CoordinatorLayout>

答案 1 :(得分:1)

像wolfy所说,CoordinatorLayout是最好的选择,但ListView在这种情况下不起作用,因为它没有实现与CoordinatorLayout通信所需的正确回调接口。 CoordinatorLayout如何实际协调其子视图的滚动? 您需要为实现NestedScrollingChild接口的View切换ListView,您实际上不需要为这些方法编写代码,例如RecyclerView或{{1}为你照顾这项工作;)

反过来,SwipeRefreshLayout实现了NestedScrollingParent界面,让您免除其他工作量(google doc):

  

此接口应由希望支持嵌套子视图委派的滚动操作的ViewGroup子类实现。

如果您需要刷卡刷新操作,CoordinatorLayout会实现两个接口。查看视图层次结构,它位于SwipeRefreshLayoutCoordinatorLayout之间,因此它可以同时处理RecyclerViewNestedScrollingChild

底线:为NestedScrollingParent切换ListView或者使ListView实现RecyclerView。它应该以任何方式工作!

关于使用新APi处理滚动的两个很好的解释:

https://guides.codepath.com/android/Handling-Scrolls-with-CoordinatorLayout

https://lab.getbase.com/nested-scrolling-with-coordinatorlayout-on-android/

代码sample,用于从演示中实现NestedScrollingChild

答案 2 :(得分:0)

使用适合屏幕的scrolllayout并使listview包装内容

答案 3 :(得分:0)

您可以使用RecyclerView代替ListView,然后将列表打包在NestedScrollView中并致电ViewCompat.setNestedScrollingEnabled(recyclerView, false)。最重要的是,您可以使用另一个ScrollView包含所有内容(图中的红色标记的视图),然后放置NestedScrollView绿色标记列表)作为一个孩子在里面。

NestedScrollView负责动态设置的高度,否则recyclerView只会使用一个固定的高度。请注意,如果列表太长,可能会产生不必要的UI延迟,那么通过在列表中扩展不同的布局,将所有内容设置为适配器中列表的一部分会更有效。另一方面,这可能也有点棘手,因为整个布局现在是列表的一部分,并且所做的所有更改都需要通过适配器。

答案 4 :(得分:0)

这里是解决方案:

#!/bin/bash

for fileName in *.sto; do
    protID_list=( $(grep -o "WP_.\{0,11\}" $fileName | sort | uniq) )
    echo ${protID_list[@]}
    file=$(echo $fileName | cut -d '_' -f 1,2,3)
    file=$(echo $file'_protein.faa')
    echo $file 
    for protID in ${protID_list[@]}; do
       if [ -n "$protID" ]; then
          gawk "/^>/{N=0}/^.*$protID/{N=1} {if(N)print}" $file >> 
          sequence_protein.file
       fi
    done
done

<强>输出:

enter image description here