Разделитель ListView между элементами

Я хотел бы вставить разделитель между элементами в ListView, как на картинке ниже.

Образец

Есть 2 проблемы:

  1. Если я добавлю его (в качестве границы) в нижней части элемента в ItemTemplate, последний элемент будет иметь разделитель, и это не должно быть.
  2. Если я найду способ добавить разделитель внеItemTemplateКак бы я выровнять его по меткам?

2 ответа

Решение

Вам нужно использовать DataTemplateSelector за это. Сначала нужно создать Два DataTemplate"s

Например: в простом ItemsControl, который я хочу показать вам список String, My Two 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

введите описание изображения здесь

Используйте атрибут Divider в XML в listView. Я надеюсь, что он удовлетворяет вашему требованию. Например,

В 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>
Другие вопросы по тегам