在Xamarin Forms中的Grid内的ListView中可见的项目

时间:2016-12-30 14:09:11

标签: listview grid xamarin.forms

我正在使用Xamarin Forms创建一个通用应用程序。

代码只在Universal项目上,我正在创建图形,通过代码添加组件并将它们传递给ContentPage。

该页面包含一个具有屏幕大小的网格。在网格内部有两个ListView,每个都使用垂直一半的屏幕。

要检索可见项目,我正在使用两个事件ItemAppearing和ItemDisappearing。我不仅需要知道可见元素,还需要知道最重要元素。

问题是在Android中,系统在第一个ListView中加载四个项目以适应空间,然后激活滚动条以滚动到其他项目。如果只有四个可见,Windows中的相同代码也会加载更多元素,调试我发现正在加载更多元素以适应整个屏幕,而不仅仅是ListView所在的一半。

Xamarin中的不同行为是否是一个错误?是否有其他方法可以检索可见的项目和顶部的项目?

我需要的东西适用于所有类型的设备,而不是部分解决方案。

public class Verses : ContentPage
{
    ListView listView, listView1;
    List<VERS> versesENG, versesOTH;

    public List<int> visible = new List<int>();

    public Verses(CHAPTER chapterENG, CHAPTER chapterOTH)
    {
        versesENG = chapterENG.VERS.ToList();
        versesOTH = chapterOTH.VERS.ToList();

        listView = new ListView();
        listView.ItemsSource = versesENG;
        listView.ItemTemplate = new DataTemplate(typeof(CustomCell));
        listView.HasUnevenRows = true;
        listView.RowHeight = -1;
        listView.ItemTapped += ListView_ItemTapped;
        listView.ItemAppearing += ListView_ItemAppearing;
        listView.ItemDisappearing += ListView_ItemDisappearing;

        listView1 = new ListView();
        listView1.ItemsSource = versesOTH;
        listView1.ItemTemplate = new DataTemplate(typeof(CustomCell));
        listView1.HasUnevenRows = true;
        listView1.RowHeight = -1;
        listView1.ItemTapped += ListView1_ItemTapped;

        Grid grid = new Grid();
        grid.RowDefinitions.Add(new RowDefinition { Height = new GridLength(1, GridUnitType.Star) });
        grid.RowDefinitions.Add(new RowDefinition { Height = new GridLength(1) });
        grid.RowDefinitions.Add(new RowDefinition { Height = new GridLength(1, GridUnitType.Star) });
        grid.ColumnDefinitions.Add(new ColumnDefinition { Width = new GridLength(1, GridUnitType.Star) });
        grid.Children.Add(listView, 0, 0);
        grid.Children.Add(new BoxView() { HeightRequest = 1, BackgroundColor = Color.Accent }, 0, 1);
        grid.Children.Add(listView1, 0, 2);

        Content = grid;
    }

    private void ListView_ItemTapped(object sender, ItemTappedEventArgs e)
    {
        VERS v = (VERS)e.Item;
        listView1.ScrollTo(listView1.ItemsSource.OfType<object>().ElementAt(v.vnumber - 1), ScrollToPosition.MakeVisible, true);
        listView1.SelectedItem = listView1.ItemsSource.OfType<object>().ElementAt(v.vnumber - 1);
    }

    private void ListView_ItemAppearing(object sender, ItemVisibilityEventArgs e)
    {
        VERS v = (VERS)e.Item;

        visible.Add(v.vnumber);
        visible.Sort();

        var top = visible.First();

        this.Title = "L";
        visible.Count();
        foreach (int i in visible)
        {
          this.Title += " " + i.ToString();
        }
      }
    }

    private void ListView_ItemDisappearing(object sender, ItemVisibilityEventArgs e)
    {
        VERS v = (VERS)e.Item;
        visible.Remove(v.vnumber);
    }
}

}

1 个答案:

答案 0 :(得分:0)

它是我们称之为Android的便饭。不同版本的android处理控件的方式不同。事情布局不同。即使您在某个设备上找到一个看起来与某个分辨率完全相同的解决方案,我几乎可以保证它不会在下一个设备上看起来那样。

很难就如何在没有屏幕截图或代码的情况下“修复”这个问题给出一个很好的建议。但是在大多数情况下,垂直布局我会说把它们放在一个堆栈中,让它们拥有他们想要的尽可能多的空间。小型设备将滚动大型设备将在底部有一个巨大的空块。