问题描述
我在我的 xaml 页面中创建了 ListView
,我正在从它的 cs 页面添加网格和按钮。当我在手机上运行它时,当我将 listview
滚动到底部时,后面的代码再次自动运行并再次添加相同的 listview
。我希望此 DataTemplate
代码仅针对某个代码运行,当我向下滚动到 listview
底部时,它不应再次执行。不知道为什么又执行了。
背后的代码
public List<AmanoraSlotsClass> AmanoraSlotsClassesList { get; set; }
public List<HadapsarSlots> HadapsarSlotClassesList { get; set; }
string SelectedLocation = null;
string SelectedDate = null;
Dictionary<string,string> keyvaluePairs = new Dictionary<string,string>();
int OuterI = 0;
int innerJ = 0;
public ShowSlotsPage(string _Location,string _Date)
{
this.SelectedLocation = _Location;
this.SelectedDate = _Date;
SelectedDate = SelectedDate.Replace('/','-');
if (SelectedLocation == "Amanora Town Park")
{
AmanoraSlotsClassesList = new List<AmanoraSlotsClass>();
}
else if (SelectedLocation == "Hadapsar Malwadi")
{
HadapsarSlotClassesList = new List<HadapsarSlots>();
}
else
{
return;
}
FetchData(SelectedLocation,SelectedDate);
InitializeComponent();
BindingContext = this;
//When i reach bottom of my listview this the control jumps to this and again adds same elements.
DataTemplate _dataTemplate = new DataTemplate(() =>
{
Grid _grid = new Grid();
_grid.RowSpacing = 50;
_grid.RowDeFinitions.Add(new RowDeFinition());
_grid.ColumnDeFinitions.Add(new ColumnDeFinition());
_grid.ColumnSpacing = 25;
if (SelectedLocation == "Amanora Town Park")
{
OuterI = AmanoraSlotsClassesList[0].GetType().GetProperties().Count();
}
for (int i = 0; i < OuterI - 1; i++)
{
if (SelectedLocation == "Amanora Town Park")
{
innerJ = AmanoraSlotsClassesList.Count();
}
for (int j = 0; j < innerJ; j++)
{
Button _but = new Button();
_but.FontSize = 10;
_but.Scale = 1;
_but.HeightRequest = 70;
if (SelectedLocation == "Amanora Town Park")
{
_but.Text = AmanoraSlotsClassesList[j].S1;
}
keyvaluePairs.Add(_but.Id.ToString(),$"S{i + 1}");
// ColorDtermination(_but); //Changes color of button
Grid.SetRow(_but,j);
Grid.SetColumn(_but,i);
_grid.Children.Add(_but);
}
}
var viewCell_ = new ViewCell
{
View = _grid
};
return viewCell_;
}); ///*Till here code runs again when i scroll bottom of listview.*
_listView.ItemTemplate = _dataTemplate;
if(SelectedLocation == "Amanora Town Park")
{
_listView.ItemsSource = AmanoraSlotsClassesList;
}
}
-
列表视图的 xaml 声明 -xaml declarion of listview
解决方法
Xamarin.Forms ListView 为 AmanoraSlotsClassesList
集合中的每个项目呈现您的项目模板。如果应用程序呈现额外的项目,则意味着您的收藏中有那么多项目。如果您希望列表仅呈现模板一次,请确保您的列表具有单个元素。
一些建议:
- 切换到 CollectionView(更新更好)而不是 ListView
- 将项目模板移至 Xaml 并根据集合元素类型使用 template selector