Xamarin.Forms之ListView探究筆記


一.基礎

 

 

二.進階

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上面的按鈕


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM