[英]How to hide the empty rows of a list view in xamarin.forms
I have a StackLayout
with a ListView
and I have an add-button that I want to display right under the ListView
. 我有一个带有
ListView
的StackLayout
,我有一个我想在ListView
下面显示的添加按钮。 But the ListView
displays many rows which are not used. 但
ListView
显示许多未使用的行。 Just empty rows, this is forcing my button to display at the bottom of the page. 只是空行,这迫使我的按钮显示在页面底部。 I've been messing with the
VerticalOptions
all day but cannot get the rows to disappear. 我一整天都在搞乱
VerticalOptions
但却无法让行消失。
This is my XAML code : 这是我的XAML代码:
<?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
xmlns:local="clr-namespace:LiquitMobileApp"
x:Class="LiquitMobileApp.MainPage"
Title="Settings"
>
<StackLayout BackgroundColor="LightGray">
<Label Text="Liquit Zones" TextColor="Gray" FontSize="Small" Margin="10"/>
<StackLayout AbsoluteLayout.LayoutBounds="10,10,10,10">
<ListView x:Name="UsingZone" SeparatorColor="LightGray" ItemTapped="ZonesList_ItemTapped" RowHeight="60" BackgroundColor="Green" >
<ListView.ItemTemplate>
<DataTemplate>
<ViewCell>
<ViewCell.ContextActions>
<MenuItem Clicked="OnEdit" Text="Edit" />
<MenuItem Clicked="OnDelete" CommandParameter="{Binding .}" Text="Trash" IsDestructive="True" />
</ViewCell.ContextActions>
<StackLayout Padding="15, 5, 0, 0" Orientation="Horizontal" BackgroundColor="White">
<Image Source="{Binding Image}" HorizontalOptions="Start" AbsoluteLayout.LayoutBounds="250.25, 0.25, 50, 50 "/>
<StackLayout Orientation="Vertical">
<Label Text = "{Binding Name}" FontSize="20" TextColor="Black" AbsoluteLayout.LayoutBounds="0.25, 0.25, 400, 40"/>
<Label Text = "{Binding Address}" TextColor="LightGray" AbsoluteLayout.LayoutBounds="50, 35, 200, 25"/>
</StackLayout>
</StackLayout>
</ViewCell>
</DataTemplate>
</ListView.ItemTemplate>
<ListView.Footer>
<Label />
</ListView.Footer>
</ListView>
<Button Text="Add Zone" TextColor="Black" HorizontalOptions="FillAndExpand" FontSize="Medium" Clicked="Button_Clicked" BackgroundColor="White"/>
</StackLayout>
</StackLayout>
</ContentPage>
Picture of the list and button: 列表和按钮的图片:
So, the solution I found is to force listview layout every time you add/remove an item. 因此,我找到的解决方案是每次添加/删除项目时强制列表视图布局。 You also need to wrap the list in stacklayout.
您还需要将列表包装在stacklayout中。
<StackLayout BackgroundColor="LightGray">
<Label Text="Liquit Zones" TextColor="Gray" FontSize="Small" Margin="10"/>
<StackLayout>
<ListView x:Name="ItemsListView" SeparatorColor="LightGray" BackgroundColor="Green" RowHeight="60" >
<ListView.ItemTemplate>
<DataTemplate>
<ViewCell>
<ViewCell.ContextActions>
<MenuItem Clicked="AddItemClicked" Text="Add" />
<MenuItem Clicked="RemoveItemClicked" CommandParameter="{Binding .}" Text="Trash" IsDestructive="True" />
</ViewCell.ContextActions>
<StackLayout Padding="15, 5, 0, 0" Orientation="Horizontal" BackgroundColor="White">
<Image Source="{Binding Image}" HorizontalOptions="Start"/>
<StackLayout Orientation="Vertical">
<Label Text = "{Binding ItemText}" FontSize="20" TextColor="Black" />
<Label Text = "{Binding ItemDetail}" TextColor="LightGray" />
</StackLayout>
</StackLayout>
</ViewCell>
</DataTemplate>
</ListView.ItemTemplate>
<ListView.Footer>
<Label />
</ListView.Footer>
</ListView>
</StackLayout>
<Button Text="Add Item" TextColor="Black" HorizontalOptions="FillAndExpand" FontSize="Medium" Clicked="AddItemClicked" BackgroundColor="White"/>
</StackLayout>
Because you know your cell height you can do this: 因为你知道你的细胞高度,你可以这样做:
void AddItemClicked(object sender, EventArgs e)
{
SampleData data = new SampleData();
data.ItemText = "An Item";
data.ItemDetail = "Item - " + (itemsListCollection.Count + 1).ToString();
itemsListCollection.Add(data);
ItemsListView.HeightRequest = itemsListCollection.Count * 60;
//ForceLayout();
}
void RemoveItemClicked(object sender, EventArgs e)
{
SampleData item =(SampleData)((MenuItem)sender).CommandParameter;
if (item != null)
{
itemsListCollection.Remove(item);
}
ItemsListView.HeightRequest = itemsListCollection.Count * 60;
}
class SampleData:INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
private string itemText;
public string ItemText
{
get
{
return itemText;
}
set
{
itemText = value;
NotifyPropertyChanged("ItemText");
}
}
private string itemDetail;
public string ItemDetail
{
get
{
return itemDetail;
}
set
{
itemDetail = value;
NotifyPropertyChanged("ItemDetail");
}
}
private void NotifyPropertyChanged(string propName)
{
PropertyChangedEventHandler handler = PropertyChanged;
if (handler != null)
{
handler(this, new PropertyChangedEventArgs(propName));
}
}
}
An easy way to remove the empty rows of a ListView is to set an empty footer for the ListView. 删除ListView的空行的简单方法是为ListView设置空页脚。
ListView HeaderList = new ListView()
{
Footer = ""
};
or in XAML 或者在XAML中
<ListView x:Name="HeaderList" Footer=""></ListView>
Hi everyone, 嗨,大家好,
public class Test
{
string Name{get;set;}
}
Declare globally 全球宣布
ObservableCollection<Test> objWithEmpty;
In Constructor: 在构造函数中:
objWithEmpty=new ObservableCollection<Test>();
objWithEmpty.Add(new Test(){"Venky"});
objWithEmpty.Add(new Test(){""});
objWithEmpty.Add(new Test(){"Raju"});
Now take one more ObservableCollection and check the condition as per your requirement without empty then add that item to objWithOutEmpty Collection then finally add objWithOutEmpty ItemsSource to the ListView. 现在再拿一个ObservableCollection并按照你的要求检查条件而不是空,然后将该项添加到objWithOutEmpty Collection然后最后将objWithOutEmpty ItemsSource添加到ListView。
ObservableCollection<Test> objWithOutEmpty;
foreach(var item in objWithEmpty)
{
if(item.Name !=null)
{
objWithOutEmpty.Add(new Test(){item.Name});
}
};
Now set ItemsSource to the ListView 现在将ItemsSource设置为ListView
listView.ItemsSource=objWithOutEmpty;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.