滚动到底部时,ListView 会自动添加更多内容

问题描述

我在我的 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;
        }
    }
  1. 列表视图的 xaml 声明 -xaml declarion of listview

  2. cs page code screenshot**

解决方法

Xamarin.Forms ListView 为 AmanoraSlotsClassesList 集合中的每个项目呈现您的项目模板。如果应用程序呈现额外的项目,则意味着您的收藏中有那么多项目。如果您希望列表仅呈现模板一次,请确保您的列表具有单个元素。

一些建议:

  1. 切换到 CollectionView(更新更好)而不是 ListView
  2. 将项目模板移至 Xaml 并根据集合元素类型使用 template selector