這兩天項目中需要實現一個頁面,大致的布局是頂部一塊區域是一部分內容,然后下面是一個title條,這個title條下面是一個列表,因為列表的數據可能有很多,所以這個頁面是需要整體進行滑動的,因為只讓下面的listview滾動的話,那么下面的展示區域就太小了,因為我們的listview的Item內容也比較多,但是說如果是scrollview嵌套listview,那么那個title條也會被滾動出屏幕,但是我們的那個title條里面還有觸發下面listview刪除、修改的功能,所以不能滾動出屏幕,需要有一個吸頂的效果。
??考慮過用stickylistheaderslistview,但是未免太麻煩了,所以我們自然而然的選擇了Material Design中很有滾動效果的CoordinatorLayout了,它也很擅長做這類滾動至屏幕頂端然后停止滾動的事情。接下來就跟以前似得開始寫代碼了,xml布局如下:
<android.support.design.widget.CoordinatorLayout
android:overScrollMode="never"
android:layout_alignParentTop="true"
android:layout_width="match_parent"
android:layout_height="match_parent">
<android.support.design.widget.AppBarLayout
android:overScrollMode="never"
app:elevation = "0dp"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<android.support.design.widget.CollapsingToolbarLayout
android:id="@+id/collapsingToolbarLayout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:overScrollMode="never"
app:layout_scrollFlags="scroll|exitUntilCollapsed">
<LinearLayout
android:id="@+id/firstLl"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<TextView
android:layout_width="match_parent"
android:layout_height="49dip"
android:background="@color/color_ffffff"
android:drawableLeft="@drawable/user_details_icon_basic"
android:drawablePadding="5dip"
android:gravity="center_vertical"
android:paddingLeft="16dip"
android:text="a信息"
android:textColor="@color/color_3399ff"
android:textSize="15sp"/>
<View style="@style/view_line"/>
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@color/color_ffffff">
<TextView
style="@style/style_basicinfo"
android:layout_alignParentLeft="true"
android:text="1字段"/>
<TextView
style="@style/style_basicinfo"
android:layout_alignParentRight="true"/>
</RelativeLayout>
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@color/color_ffffff">
<TextView
style="@style/style_basicinfo"
android:layout_alignParentLeft="true"
android:text="2字段"/>
<TextView
style="@style/style_basicinfo"
android:textColor="@color/color_3399ff"
android:layout_alignParentRight="true"/>
</RelativeLayout>
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@color/color_ffffff">
<TextView
style="@style/style_basicinfo"
android:layout_alignParentLeft="true"
android:text="3字段"/>
<TextView
style="@style/style_basicinfo"
android:layout_alignParentRight="true"/>
</RelativeLayout>
<LinearLayout
android:paddingTop="15dip"
android:background="@color/color_ffffff"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<View
style="@style/view_line"/>
</LinearLayout>
<View
android:background="@color/color_e5e5e5"
android:layout_width="match_parent"
android:layout_height="16dip"/>
</LinearLayout>
</android.support.design.widget.CollapsingToolbarLayout>
</android.support.design.widget.AppBarLayout>
<LinearLayout
app:layout_behavior="@string/appbar_scrolling_view_behavior"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<RelativeLayout
android:id="@+id/secondRl"
android:background="@color/color_ffffff"
android:paddingRight="16dip"
android:layout_width="match_parent"
android:layout_height="49dip">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:drawableLeft="@drawable/user_details_icon_car"
android:drawablePadding="5dip"
android:gravity="center_vertical"
android:layout_centerVertical="true"
android:paddingLeft="16dip"
android:text="b信息"
android:textColor="@color/color_3399ff"
android:textSize="15sp"/>
<ImageView
android:layout_alignParentRight="true"
android:layout_centerVertical="true"
android:src="@drawable/received_details_btn_add"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
<ImageView
android:layout_centerVertical="true"
android:layout_toLeftOf="@+id/addCarIv"
android:layout_marginRight="15dip"
android:src="@drawable/received_details_btn_edit"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
<ImageView
android:visibility="gone"
android:layout_alignParentRight="true"
android:layout_centerVertical="true"
android:src="@drawable/received_details_btn_cancel"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
</RelativeLayout>
<View
style="@style/view_line"/>
<LinearLayout
android:id="@+id/addLl"
android:gravity="center"
android:orientation="vertical"
android:background="@color/color_ffffff"
android:layout_width="match_parent"
android:layout_height="match_parent">
<ImageView
android:src="@drawable/received_icon_details_empty"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
<TextView
android:textSize="15sp"
android:text="此處有點空"
android:layout_marginTop="15dip"
android:textColor="@color/color_333333"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
<TextView
android:textSize="18sp"
android:text="快來添加吧"
android:layout_marginTop="10dip"
android:textColor="@color/color_3399ff"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
</LinearLayout>
<android.support.v7.widget.RecyclerView
android:id="@+id/carlistview"
android:overScrollMode="never"
android:background="@color/color_ffffff"
android:divider="@drawable/developcar_shape_divider"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
</LinearLayout>
</android.support.design.widget.CoordinatorLayout>
上面可以看到id為firstLl的LinearLayout就是我們最初說的那個頂部布局,而id為secondRl的RelativeLayout則是我們說的那個需要吸頂的title條了,用過CoordinatorLayout的同學都知道,如果哪部分需要滑動出屏幕,那么那部分就需要寫在CollapsingToolbarLayout布局中,而CollapsingToolbarLayout需要寫在AppBarLayout中,同時為了能夠使這部分內容能夠滑動或者找到其在CoordinatorLayout中的位置,需要給這部分布局設置layout_scrollFlags屬性,一般都設置值為scroll|exitUntilCollapsed因為我們也不需要特殊的漸變之類的效果,只要能滑出屏幕就好了,然后呢,需要滑動到頂部然后吸頂的布局我們需要設置layout_behavior屬性,它告訴了CoordinatorLayout自己在滑動時候執行什么行為,為了制造吸頂需要設置其值為@string/appbar_scrolling_view_behavior就好了,然后運行一看貌似一切都很美好。
??其實我上面的布局還有一個id為addLl的LinearLayout,它是干嘛的呢?大家都知道列表沒有數據的時候,總要給用戶一些提示吧,它就是那個提示,其實里面就是一些文字以及圖片了,但是是居中展示的,不過發現一個問題,就是當列表為空這個布局展示的時候,里面的內容并沒有完全居中,只是水平方向上居中了,垂直方向上是在屏幕底部的,這是為啥呢?其實就是一個簡單的布局,但是它是被放在CoordinatorLayout中的,后來經過多次調試,發現是layout_scrollFlags的scroll值搗的鬼,如果不設置這個scroll值,那么下面是可以居中的,但是頂部不能滑動了,如果設置的話,頂部是能夠滑動了,但是下面不能居中了。所以最終的解決方式是動態設置這個layout_scrollFlags屬性了,實例代碼如下:
//因為在CoordinatorLayout中如果給CollapsingToolbarLayout設置的ScrollFlags有scroll,那么下面設置layout_behavior的布局就無法垂直居中
//但是不設置scroll屬性,那么上面的有無法滑動然后吸頂。所以只能夠動態設置了
private void setCollapsingToolbarLayoutFlag(@AppBarLayout.LayoutParams.ScrollFlags int flags){
AppBarLayout.LayoutParams layoutParams = (AppBarLayout.LayoutParams) binding.collapsingToolbarLayout.getLayoutParams();
layoutParams.setScrollFlags(flags);
binding.collapsingToolbarLayout.setLayoutParams(layoutParams);
上面的注釋寫的也很清楚,分別在下面的recyclerview有無數據時候動態調用這個setCollapsingToolbarLayoutFlag方法來動態設置了。這樣子問題就算解決了。但是為啥不能居中還是沒太搞明白,有知道的朋友還請多多指教。另外做的時候還發現一個問題,就是AppBarLayout會出現陰影,這個是android5.0之后material design自帶的,但是在某些手機上不好看,我們就想要去掉,是要設置elevation屬性,但是一定是app:elevation否則會無效哦,因為對于AppBarLayout這個算是自定義屬性。
?? 好的,以上就是本次的全部內容,有問題歡迎批評指正。