滚动到列表视图中的结束位置

时间:2019-08-08 10:51:19

标签: listview xamarin xamarin.forms

我有一个类“ ChatListView ”,该类是从 Listview 继承的。

public  class ChatListView:ListView
{
}

,并使用Cs中的ChatListView以编程方式列出了一个列表:

 messageList = new ChatListView();
            messageList.HasUnevenRows = true;
            messageList.VerticalOptions = LayoutOptions.FillAndExpand;
            messageList.SetBinding(ChatListView.ItemsSourceProperty, new Binding("Messages"));
            messageList.ItemTemplate = new DataTemplate(CreateMessageCell);

我已将其绑定到我正在获取“消息”的视图模型上

 Messages = new ObservableCollection<ChatMessageViewModel>(TotalMessages.Skip(TotalMessages.Count - App.PagingCount));

我需要将列表滚动到结束位置。为此,我编写了如下代码:

 ViewModel.Messages.CollectionChanged += (s, ex) =>
        {

            Device.BeginInvokeOnMainThread(() =>
            {
                if (ViewModel.Messages.Any())
                {
                    messageList.ScrollTo(ViewModel.Messages.LastOrDefault(), ScrollToPosition.End, false);

                }
            });
        };

但这对我不起作用。我觉得列表调用或列表名称可能有问题。任何指导或帮助都可以帮助我发现我的方法出了什么问题。

3 个答案:

答案 0 :(得分:2)

您不必在每次收到新消息时都换掉Messages实例,而只需添加它。否则,您的整个ListView将刷新,并且CollectionChanged事件不会触发,因为它是一个全新的实例。

因此,当您收到消息时,请执行以下操作:

Messages.Add(newMessage);

然后CollectionChanged事件将触发Added事件:

ViewModel.Messages.CollectionChanged += OnCollectionChanged;

private void OnCollectionChanged(object sender, CollectionChangeEventArgs args)
{
    if (args.Action == CollectionChangeAction.Add) // items were added
    {
        messageList.ScrollTo(ViewModel.Messages.LastOrDefault(), ScrollToPosition.End, false);
    }
}

确保在构造函数中或作为属性声明的一部分实例化Messages

public ObservableCollection<ChatMessageViewModel> Messages { get; } = new ObservableCollection<ChatMessageViewModel>();

答案 1 :(得分:1)

尝试将ScrollToPosition.End更改为ScrollToPosition.MakeVisible

答案 2 :(得分:0)

尝试此代码..这对我有用。

if (Device.RuntimePlatform == Device.Android)
                {
                    messageList.ScrollTo(ViewModel.Messages.LastOrDefault(), ScrollToPosition.End, false);
                }
                else if (Device.RuntimePlatform == Device.iOS)
                {
                    messageList.ScrollTo(ViewModel.Messages.LastOrDefault(), ScrollToPosition.End, true);
                }