项目之间的 ListView 分隔符

ListView separator between items

我想在 ListView 中的项目之间插入一个分隔符,如下图所示。

有2个问题:

  1. 如果我在 ItemTemplate 中的项目底部添加它(作为边框),最后一个项目将有一个分隔符,但它不应该。
  2. 如果我找到在 ItemTemplate 之外添加分隔符 的方法,我将如何使其与标签对齐?

在 listView.I 中使用 XML 中的 Divider 属性希望它能满足您的 requirment.For 示例,

在activity_main.xml中:

    <ListView
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_alignParentStart="true"
    android:layout_below="@+id/buttn"
    android:divider="@color/Divider"
    android:dividerHeight="2dp"
    android:id="@+id/listview"/>

在color.xml中:

 <resources>
<color name="colorPrimary">#3F51B5</color>
<color name="colorPrimaryDark">#303F9F</color>
<color name="colorAccent">#FF4081</color>
<color name="Divider">#085411</color></resources>

您需要为此使用 DataTemplateSelector。首先你需要创建两个DataTemplate's

例如:在一个简单的 ItemsControl 中,我想向您展示一个字符串列表,我的两个 DataTemplate 如下所示。

<Page.Resources>  
    <DataTemplate x:Name="AllItems">  
        <Border BorderBrush="{StaticResource SystemControlBackgroundBaseLowBrush}" BorderThickness="0,0,0,2">  
            <TextBlock Text="{Binding ''}" Padding="10" Margin="10,0" />  
        </Border>  
    </DataTemplate>  
    <DataTemplate x:Name="LastItems">  
            <TextBlock Text="{Binding ''}" Padding="10" Margin="10,0" />  
    </DataTemplate>  
</Page.Resources>

现在我创建一个 DataTemplateSelector 并检查我需要应用 DataTemplate 的项目是否是最后一个。

public class ItemsDataTemplateSelector: DataTemplateSelector
{
    public DataTemplate AllItems { get; set; }
    public DataTemplate LastItems { get; set; }

    protected override DataTemplate SelectTemplateCore(object item, DependencyObject container)
    {
        DataTemplate _returnTemplate = new DataTemplate();
        var itemsControl = ItemsControl.ItemsControlFromItemContainer(container);
        if (itemsControl.IndexFromContainer(container) == (itemsControl.ItemsSource as List<String>).Count-1)
        {
            _returnTemplate = LastItems;
        }
        else
        {
            _returnTemplate = AllItems;
        }
        return _returnTemplate;
    }
}

现在我的 ItemsControl 实现是

<ItemsControl x:Name="listView">  
    <ItemsControl.ItemTemplateSelector>  
        <local:ItemsDataTemplateSelector AllItems="{StaticResource AllItems}" LastItems="{StaticResource LastItems}" />  
    </ItemsControl.ItemTemplateSelector>  
</ItemsControl>

这是我将 ItemsSource 设置为 ItemsControl 的方法

List<String> items = new List<string>();  
for (int i = 1; i <= 5; i++)  
{  
    items.Add("Item " + i.ToString());  
}  
listView.ItemsSource = items;  

以下是您的输出。您可以看到最后一项没有 Border