一.基礎
二.進階
1.使用ListView實現多選
Android原生的ListView
2.在添加Item或者移除Item的過程中
ChildAdded and DescendentAdded 這兩種方式是不會觸發的
ItemAppearing會被觸發,但是sender是ListView
3.布局
我們知道ListView本身就是一個可滑動的控件,就像ScrollView類型,所以它的高度不由它的元素的總高度確定的(如果高度是和子元素的總高度一致,還有能滑動嗎?),而是我們來手動確定一個高度的,所以當下面的這種情況出現時,就很尷尬了
<ScrollView> <StackLayout> <ListView> </ListView> </StackLayout> </ScrollView>
Forms的界面是有一個計算順序的,先從子元素計算,然后來根據子元素的大小計算父容器的大小(固定父容器大小的情況不一樣),此時ListView是有一個默認的高度的,當界面布局下渲染結束后ScrollView的ScrollHeight(ScrollView並沒有這個屬性,僅用作表示)是固定的,一般情況下,如果ScrollView里面的元素的高度發生變化,ScrollView的ScrollHeight是會發生變化的,但現在你會發現,如果改變ListView的ItemsSource,一切都沒有變化
原因:ListView的子元素增加並不會引起ListView的高度的變化(因為可以滑動)
驗證:
1.監聽ListView的SizeChanged事件,發現並沒有被觸發
2.直接在ListView下面放一個元素來觀察高度變化

由於ListView和ScrollView都是可滾動的控件,所以當ListView放在ScrollView就形成了手勢沖突,此時只能滾動ScrollView,ListView就只能顯示上面的殘缺布局
解決方法:
1.將ListView設置一個足夠的固定高度(最簡單)(但最后會有一片空白)
2.重寫手勢,將在ListView控件的部分滑動的是ListView而不是ScrollView(很困難,特別是Forms,要在兩個平台單獨寫代碼)
3.不使用ListView,直接使用StackLayout,手動的添加/移除 Item,此時StackLayout的Size會發生變化,也會引起ScrollView的大小變化(未測)
4.將ListView的高度設為0,ItemsSource變化的時候估摸着給ListView設置高度,ItemMaxSize*N(未測,此時ScrollView的高度會動態變化,但是ListView下面還是有一片空白區域,但是比方案1應該好一些)
4.分隔符高度
Android中的ListView是可以設置ListView的分割符的高度(DividerHeight),但是iOS中是不行的,如果只是需要在Android中設置分隔符高度,使用Style即可以實現,如果要通用的話,我做了一下的嘗試:
1)設置Page的背景色為灰色,並且設置ListView為背景色為白色,隱藏掉ListView的分隔符,在ViewCell的下面添加一個同Page底色相同的BoxView
<ListView.ItemTemplate>
<DataTemplate>
<ViewCell>
<Frame Padding="0">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="auto" />
<RowDefinition Height="10" />
</Grid.RowDefinitions>
<Grid Padding="5">
<Grid.RowDefinitions>
<RowDefinition Height="auto" />
<RowDefinition Height="auto" />
<RowDefinition Height="auto" />
<RowDefinition Height="auto" />
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="80" />
<ColumnDefinition Width="*" />
</Grid.ColumnDefinitions>
<Label Text="巡檢路線" />
<Label Grid.Column="1" Text="{Binding inspectRoute}" />
<Label Grid.Row="1" Text="巡檢車輛" />
<Label Grid.Row="1" Grid.Column="1" Text="{Binding vehicleUsr}" />
<Label Grid.Row="2" Grid.Column="0" Text="巡檢人" />
<Label Grid.Row="2" Grid.Column="1" Text="{Binding inspectorDesc}" />
<Label Grid.Row="3" Grid.Column="0" Text="派發時間" />
<Label Grid.Row="3" Grid.Column="1" Text="{Binding createTime,StringFormat='{0:yyyy-MM-dd HH:mm:ss}'}" />
</Grid>
<!--分隔符-->
<BoxView Grid.Row="1" BackgroundColor="{StaticResource Color_Gray}" />
</Grid>
</Frame>
</ViewCell>
</DataTemplate>
</ListView.ItemTemplate>
大概實現的效果是直角的CardView樣式,有按壓效果
2)在1)的基礎上,取消掉ListView的背景色(直接是默認的),然后將ViewCell最外層的Frame的背景色設為White,我們知道Frame是圓角的,最終的效果是:CardView的樣式(圓角),有分隔符高度,但是沒有按壓效果(因為設置了ViewCell的背景色為White的原因)
但是這種方法會出現兩個BUG:
.由於每個Item的分隔符是在Item中,如果只有一兩個,最后一個Item后面會有分隔符
.由於iOS的操作的左滑,會出現陰影部分也會包含在里面左滑(Android的沒影響,默認是長按操作),所以會對列表進行操作的這種,不要使用這種樣式
5.風格
由於本人常用的是Android以及最開始開發的也是Android,所以考慮的風格總是以Android的角度來看
ListView這種控件在Android中其實可以風格多變,譬如官方的CardView風格,因為他的操作就是長按或者點擊;
但是在iOS中,ListView的操作默認就是左滑,這種風格,ListView最好還是不要設置Margin(不然菜單很奇怪),應該設置Cell的Padding,也不適合設置分隔符的高度
在觀察中,只發現'微博ipad客戶端'發現有分隔符高度,但是他的Item操作是點擊Item上面的按鈕
