我需要像WhatsApp这样的用于聊天的ListView渲染器。
新消息到来时自动向下滚动。
请让我知道是否有样品。
谢谢
答案 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支持团队