【问题标题】:ListView is adding more content automatically when scrolled to bottom滚动到底部时,ListView 会自动添加更多内容
【发布时间】:2021-04-29 18:16:52
【问题描述】:

我在我的 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. listview 的 xaml 声明 -xaml declarion of listview

  2. cs page code screenshot**

【问题讨论】:

    标签: c# .net xaml xamarin xamarin.forms


    【解决方案1】:

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

    一些建议:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-10
      • 2015-03-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多