locked
ListView тормозит и не грузит элементы ввремя RRS feed

  • Вопрос

  • Столкнулся с непонятной проблемой.

    Пишу приложение, которое выводит в ListView список новостей с соц.Сети ВК. Подгружаю элементы в ListView, начинаю листать и нарываюсь на еще незаполненное пространство ListView. Интерфейс зависает до тех пор пока не появятся элементы в ListView. Если после этого начать листать ленту вверх, то происходи тоже самое.

    До этого пользовался ListBox'ом, такого не наблюдал.

    Подскажите, что за билеберда

    6 сентября 2013 г. 8:49

Ответы

  • Я смог исправить проблему, заполняя элементы ListView не стэк-панелями, а сначала создавая ListViewItem с контентом-стекпанелю и добавляя в ListView созданный ListViewItem

    Было:

    foreach (StackPanel item in stp)
                {
                    lvFeed.Items.Add(item);
                }

    Стало:

    foreach (StackPanel item in stp)
                {
                    ListViewItem lvItem = new ListViewItem();
                    lvItem.Content = item;
                    lvFeed.Items.Add(lvItem);
                }

    • Помечено в качестве ответа evgeniy.polonskiy 6 сентября 2013 г. 14:00
    6 сентября 2013 г. 13:59

Все ответы

  • Вы новости сразу все отрисовываете или порциями по прокрутке подгружаете?
    6 сентября 2013 г. 8:54
  • Порциями по 20 штук. Загружаю с сервера 20 новостей, закидываю в листвью. Если юзеру надо больше новостей, он жмет на кнопку

    6 сентября 2013 г. 9:05
  • У вас картинки в новостях, в режиме реального времени не подтягиваются?
    6 сентября 2013 г. 13:03
    Отвечающий
  • нет, вся информация, включая все возможные вложения грузятся один раз и только потом происходит заполнение

    6 сентября 2013 г. 13:56
  • Я смог исправить проблему, заполняя элементы ListView не стэк-панелями, а сначала создавая ListViewItem с контентом-стекпанелю и добавляя в ListView созданный ListViewItem

    Было:

    foreach (StackPanel item in stp)
                {
                    lvFeed.Items.Add(item);
                }

    Стало:

    foreach (StackPanel item in stp)
                {
                    ListViewItem lvItem = new ListViewItem();
                    lvItem.Content = item;
                    lvFeed.Items.Add(lvItem);
                }

    • Помечено в качестве ответа evgeniy.polonskiy 6 сентября 2013 г. 14:00
    6 сентября 2013 г. 13:59
  • А не пробовали создать ObservableCollection, сбиндить её к ListView, и наполнять просто коллекцию, а не создавать руками UI контролы. Это сделает Ваш код более гибким.
    6 сентября 2013 г. 14:04
  • А не пробовали создать ObservableCollection, сбиндить её к ListView, и наполнять просто коллекцию, а не создавать руками UI контролы. Это сделает Ваш код более гибким.

    Пытался сначала. Но столкнулся с проблемой. Вместе с новостью может приходить множество фотографий, аудиозаписей и видео. И все в одной новости. Мне кажется, что создавать шаблон, в который включать сразу все возможные вложения (а их 12 типов), не правильно. Но если есть вариант, как это сделать, то я был бы рад вашей помощи
    6 сентября 2013 г. 15:24
  • Вы в 1 шаблон пихали все типы или использовали DataTemplateSelector?
    6 сентября 2013 г. 20:09
  • Нет, я, как раз, не стал создавать шаблон потому что не понимаю, как это грамотно сделать. Я могу лишь сделать статичный шаблон, куда напихать сразу все возможные вложения, но это будет безграмотно и некрасиво. Был бы признателен вашей помощи

    6 сентября 2013 г. 22:35
  • Просмотрел эту статью, написано хорошо и с картинками. Если у Вас не будет получаться - говорите, не стесняйтесь :)

    Суть DataTemlateSelector в том, что вам приезжает какой-то объект, вы его идентифицируете - проверяете тип/значение и т.д., главное определить, что именно этому объекту нужен конкретный DataTemplate и просто возвращаете этот DataTemplate. Всё довольно просто.

    7 сентября 2013 г. 9:45
  • Спасибо вам большое. Обязательно прочитаю статью, но сначала пообедаю =)
    7 сентября 2013 г. 9:49
  • Олег,

    Я прочитал статью, но не понял некоторые вещи. 

    Правильно ли я понимаю, что класс TopsyList - собственный класс, который придумал автор?

    7 сентября 2013 г. 11:45
  • Да, вместо TopsyList может быть Author, Book и тд, абсолютно любой тип. 

    Смотрите, Вы связываете с помощью binding контрол listView и Вашу коллекцию конкретного типа или object'ов(если object'ов, то допустим у Вас как раз в 1 коллекции содержатся разные типы, предположим у Вас там лежат типы Book и Author).

    Вот в метод SelectTemplateCore в object item приезжает 1 объект книги. Как Вы узнаете что это книга? Ну, к примеру "if(item is Book)", проверку проходит и метод должен вернуть DataTemplate для книги, потом в метод может приехать объект Author. Проверяем его тип и возвращаем темплейт для автора и тд.. В статье у автора просто 1 объект и он их различает по свойству.

    8 сентября 2013 г. 9:11
  • Олег,

    я не понимаю.... Я должен привязать к моему ListView колллекцию коллекций объектов?

    Например, у меня есть объекты Автор, Книга, Читатель

    В качестве Одного элемента ListViewItem у меня будет выступать коллекция объектов Автор, Книга, Читатель?

    Грубо говоря

    ListView.ItemsSource = ObservableCollection<CommonType>,

    где CommmonType - объект с коллекциями объектов типа Автор, Книга, Читатель

    8 сентября 2013 г. 9:36

  • var yourCommonCollection = new ObservableCollection<object>();
    
    yourCommonCollection.Add(new Author {Name = "aaa"});
    
    yourCommonCollection.Add(new Book {Title = "bbb"});

    Теперь у нас есть общая коллекция, дальше listView получит эту коллекцию и начнет каждому айтему давать нужный темплейт, используя DataTemplateSelector.

    8 сентября 2013 г. 11:11
  • Нет, это я представляю. У меня другая проблема

    ListViewItem может быть таким ObservableCollection<Audio>, ObservableCollection<Photo>, ObservableCollection<Link>, ObservableCollection<Video> + заголовок из текста и картинки

    И таких ListViewItem'ов много

    8 сентября 2013 г. 13:01
  • Олег, спасибо вам большое

    Я вынес вопрос в отдельную тему http://social.msdn.microsoft.com/Forums/ru-RU/22febfc3-94be-4f00-a920-6e59526f4fa4/-listviewitem

    8 сентября 2013 г. 18:02