Xamarin Forms Listview не обновляет графический интерфейс - PullRequest
0 голосов
/ 17 февраля 2019

Я пытаюсь создать страницу чата.Есть просмотр списка, чьим источником является ObservableCollection.Кажется, что все идет гладко, пока элемент не добавлен в ObservableCollection.Добавленный элемент не сразу появляется на экране, и только после прикосновения к экрану он появляется.

На самом деле, у меня та же проблема, что и здесь: https://forums.xamarin.com/discussion/18631/listview-binding-to-observablecollection-does-not-update-gui/p2

Я считаю,одно из решений, указанных в потоке (Страница 2), имеет отношение к INotifyPropertyChanged.После многих попыток применить решение в соответствии с моими потребностями я не могу этого сделать.Не могли бы вы, пожалуйста, направить меня в правильном направлении.

Мой код суммирован следующим образом:

public partial class Chat : ContentPage
{
    private ObservableCollection<MessageObj> Messages = new ObservableCollection<MessageObj>();

    public Chat(string name, string imageURL, int UID)
    {
        msgList.ItemsSource = Messages; //msgList is ListView in XAML
    }

    public class MessageObj
    {
        public string Mess { get; set; }
        public TextAlignment textAlignment { get; set; }

        public MessageObj(string Mess, TextAlignment textAlignment)
        {
            this.Mess = Mess;
            this.textAlignment = textAlignment;
        }
    }
}

Я также прочитал: формы XamarinListView ObservableCollection не обновляется Я думаю, что я изменяю коллекцию, так что я не должен сталкиваться с этой проблемой, но у меня есть.Любая помощь / понимание будет принята с благодарностью!

Я добавил справочную информацию, содержащую мой код для справки, в котором показаны мои теперь прокомментированные попытки различных решений: https://gist.github.com/Dobermensch/49ee9d8adb9a83a38790b691c857691d

Редактировать: добавлено немного больше изначально пропущенного кода вgist

Edit2: к вашему сведению, я не использую шаблон MVVM.

1 Ответ

0 голосов
/ 18 февраля 2019

Как вы пояснили в комментариях, проблема заключается в сообщениях, полученных во время обратного вызова OnMessageReceived от SendBird API.Прочитав их документацию, они не вызывают синхронный обратный вызов с потоком пользовательского интерфейса.

Приложения Xamarin могут быть многопоточными, и существует один основной поток пользовательского интерфейса, который должен бытьучаствует во всех обновлениях пользовательского интерфейса.Во многих приложениях код, который вы пишете, будет работать в потоке пользовательского интерфейса, если вы не сделаете такие вещи, как Task.Run() или await <some async task>.ConfigureAwait(false), чтобы принудительно отключить поток пользовательского интерфейса.Поэтому обычно вам не нужно беспокоиться о пользовательском интерфейсе, а не о потоках без пользовательского интерфейса.Обратные вызовы от взаимодействия пользователя с пользовательским интерфейсом, такие как нажатия кнопок, также выполняются в потоке пользовательского интерфейса.Обратные вызовы из не-UI источников могут быть или не быть в потоке UI (в зависимости от реализации и удачи), и я подозреваю, что это так.

В зависимости от платформы, на которой вы работаете, разные вещи могутпойти не так, если вы попытаетесь изменить пользовательский интерфейс из кода, который не является потоком пользовательского интерфейса.Иногда вы получаете сбой (типичный ответ iOS) или просто не сразу обновляетесь (обычное поведение Android).

Итак, я бы попытался заставить обновление коллекции произойти в потоке пользовательского интерфейса, используя Device.Поток пользовательского интерфейса, который будет знать, как на самом деле обновить пользовательский интерфейс.

...