在Xamarin表单中网格内的ListView中可见的项

在Xamarin表单中网格内的ListView中可见的项,listview,grid,xamarin.forms,Listview,Grid,Xamarin.forms,我正在使用Xamarin表单创建一个通用应用程序 代码仅在Universal项目中,我正在创建图形,通过代码添加组件并将其传递到ContentPage 该页面包含一个具有屏幕大小的网格。在网格内部有两个列表视图,每个视图使用屏幕的垂直一半 为了检索可见的项目,我使用了两个事件itemseinging和itemseingoing。我不仅需要知道可见元素,还需要知道最上面的元素 问题是,在Android系统中,系统在第一个列表视图中加载四个项目以适应空间,然后激活滚动条以滚动到其他项目。如果只有四个

我正在使用Xamarin表单创建一个通用应用程序

代码仅在Universal项目中,我正在创建图形,通过代码添加组件并将其传递到ContentPage

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

为了检索可见的项目,我使用了两个事件itemseinging和itemseingoing。我不仅需要知道可见元素,还需要知道最上面的元素

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

这种不同的行为是Xamarin中的一个bug吗?是否有其他方法检索可见项和顶部项

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

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);
    }
}
public类诗句:ContentPage
{
ListView ListView,listView1;
列出versesENG,versesOTH;
公共列表可见=新列表();
公共诗篇(第二章,第三章)
{
versesENG=chapterENG.VERS.ToList();
versesOTH=chapterOTH.VERS.ToList();
listView=新建listView();
listView.ItemsSource=versesENG;
listView.ItemTemplate=新数据模板(typeof(CustomCell));
listView.HasRows=true;
listView.RowHeight=-1;
listView.ItemTapped+=listView\u ItemTapped;
listView.itemsapping+=listView\u itemsapping;
listView.ItemEngling+=listView\u ItemEngling;
listView1=新建ListView();
listView1.ItemsSource=versesOTH;
listView1.ItemTemplate=新数据模板(typeof(CustomCell));
listView1.1行=true;
listView1.RowHeight=-1;
listView1.ItemTapped+=listView1_ItemTapped;
网格=新网格();
grid.RowDefinitions.Add(newrowdefinition{Height=newgridlength(1,GridUnitType.Star)});
添加(新行定义{Height=newgridlength(1)});
grid.RowDefinitions.Add(newrowdefinition{Height=newgridlength(1,GridUnitType.Star)});
Add(newColumnDefinition{Width=newGridLength(1,GridUnitType.Star)});
grid.Children.Add(listView,0,0);
Add(new-BoxView(){HeightRequest=1,BackgroundColor=Color.Accent},0,1);
grid.Children.Add(listView1,0,2);
内容=网格;
}
私有无效列表视图_itemtapted(对象发送方,itemtapedeventargs e)
{
VERS v=(VERS)e.项目;
listView1.ScrollTo(listView1.ItemsSource.OfType().ElementAt(v.vnumber-1),ScrollToPosition.MakeVisible,true);
listView1.SelectedItem=listView1.ItemsSource.OfType().ElementAt(v.vnumber-1);
}
private void ListView_itemseapping(对象发送方,ItemVisibilityEventArgs e)
{
VERS v=(VERS)e.项目;
可见。添加(v.vnumber);
visible.Sort();
var top=visible.First();
本文件的标题为“L”;
可见。Count();
foreach(可见的int i)
{
this.Title+=“”+i.ToString();
}
}
}
private void ListView_itemEnglishing(对象发送方,ItemVisibilityEventArgs e)
{
VERS v=(VERS)e.项目;
可见。移除(v.v编号);
}
}

}

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


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

感谢您的评论。我添加了一些代码,我的应用程序将允许阅读两种语言的内容,重要的不是图形,而是内容。我想同步两个列表视图之间的滚动和选择。由于这个原因,我需要知道最上面的项目和可见的项目。我自己没有尝试过这样做,但我最近需要用日历控件同步日期列表。我们最终使用了旋转木马视图。我想你可以用2个carosel视图来完成这项工作,并且可能对布局有更好的控制