项目之间的 ListView 分隔符
ListView separator between items
我想在 ListView
中的项目之间插入一个分隔符,如下图所示。
有2个问题:
- 如果我在
ItemTemplate
中的项目底部添加它(作为边框),最后一个项目将有一个分隔符,但它不应该。
- 如果我找到在
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
我想在 ListView
中的项目之间插入一个分隔符,如下图所示。
有2个问题:
- 如果我在
ItemTemplate
中的项目底部添加它(作为边框),最后一个项目将有一个分隔符,但它不应该。 - 如果我找到在
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