是否有人有Listview渲染器进行聊天

时间:2019-05-22 12:27:01

标签: c# xamarin xamarin.forms xamarin.ios syncfusion

我需要像WhatsApp这样的用于聊天的ListView渲染器。

新消息到来时自动向下滚动。

请让我知道是否有样品。

谢谢

3 个答案:

答案 0 :(得分:1)

您不需要自定义渲染器,只需使用ListView并添加一些逻辑即可为您滚动。

View.xaml文件:

<!-- Previous Implementation -->

        <ListView x:Name="MessagesListView"
              Grid.Row="0"
              BackgroundColor="Transparent"
              HasUnevenRows="True"
              ItemTemplate="{StaticResource MessageTemplateSelector}"
              ItemsSource="{Binding Messages}"
              SelectionMode="None"
              SeparatorVisibility="None" />

<!-- Remaining Implementation -->

x:Name属性是重要的部分,您将在后面的代码中使用该名称。

现在是View.xaml.cs文件:

// Previous Implmentation

    /// <summary>
    /// Override of OnAppearing method. Fires as page is appearing.
    /// Good place to set up event handlers.
    /// </summary>
    protected override void OnAppearing()
    {
        base.OnAppearing();

        ((INotifyCollectionChanged)MessagesListView.ItemsSource).CollectionChanged += OnListViewCollectionChanged;
    }

    /// <summary>
    /// Override of OnDisappearing method. Fires as page is disappearing.
    /// Good place to tear down event handlers.
    /// </summary>
    protected override void OnDisappearing()
    {
        base.OnDisappearing();

        ((INotifyCollectionChanged)MessagesListView.ItemsSource).CollectionChanged -= OnListViewCollectionChanged;
    }

    /// <summary>
    /// Scrolls a the messages listview to the last item whenever
    /// a new message is added to the collection.
    /// </summary>
    private void OnListViewCollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
    {
        var myList = ((IEnumerable<Message>)MessagesListView.ItemsSource).ToList();

        // Must be ran on main thread or Android chokes.
        Device.BeginInvokeOnMainThread(async () =>
        {
            // For some reason Android requires a small delay or the scroll never happens.
            await Task.Delay(50);
            MessagesListView.ScrollTo(myList.Last(), ScrollToPosition.End, false);
        });
    }

// Remaining Implementation

基本上,您将设置一个事件,以在ListView的ItemSource更改时触发。在这种情况下,您将滚动到列表的末尾。

答案 1 :(得分:0)

您不需要自定义渲染器进行聊天,因为一个简单的ListView就足够了。

基本上,您会将ItemsSource属性绑定到ObservableCollection,以便在添加新消息时,它将自动出现在列表视图中。

此外,如果您认为用户不需要/不必一次查看它们,则如果有大量的历史聊天消息,则可能要使用无限滚动技术。 https://www.youtube.com/watch?v=DG5Asglf0vU

要滚动到最后一条消息:

Device.BeginInvokeOnMainThread (() => {
           Listviewname.scrollto(items[count-1], scrolltoposition.end, false)
       });
 });

答案 2 :(得分:0)

在将新项目添加到集合后,可以通过将ListView滚动到其最后一个索引来满足您的要求。要滚动列表视图,可以通过传递itemIndex来调用LayoutManager.ScrollToRowIndex方法。

private void InitializeSendCommand() {             SendIcon = ImageSource.FromResource(“ SfListViewSample.Images.SendIcon.png”,程序集);             NewText =“”;             SendCommand =新的Command(()=>             {                 如果(!string.IsNullOrWhiteSpace(NewText))                 {                     MessageInfo.Add(新的MessageInfo                     {

                    OutgoingMessageIndicator = ImageSource.FromResource("SfListViewSample.Images.OutgoingIndicatorImage.png", assembly),
                    Text = NewText,
                    TemplateType = TemplateType.OutGoingText,
                    DateTime = string.Format("{0:HH:mm}", DateTime.Now)
                });
                (ListView.LayoutManager asLinearLayout).ScrollToRowIndex(MessageInfo.Count - 1, Syncfusion.ListView.XForms.ScrollToPosition.Start);
            }
            NewText = null;
        });

}

我们随附了示例供您参考

示例链接:[http://www.syncfusion.com/downloads/support/directtrac/237037/ze/Sample2053309646][1]

希望这会有所帮助。

Syncfusion支持团队