Форум программистов, компьютерный форум CyberForum.ru

Xamarin

Войти
Регистрация
Восстановить пароль
 
levivas
1 / 1 / 0
Регистрация: 29.10.2015
Сообщений: 14
#1

Скролинг в listview - Xamarin

23.08.2016, 15:31. Просмотров 375. Ответов 0
Метки нет (Все метки)

Здравствуйте. Проблема из работой scroll в listview. Есть viewcell в котором есть текст, картинка и разное количество картинок(то есть viewcell не повторяется, а view елементов может быть разное количество, по этой же причине я не могу использовать ListViewCachingStrategy.RecycleElement, т.к. стратегия работает только, если в каждом елементе listview одинаковое количество view елементов

Что можна попробовать еще сделать. (добавил библиотеку FFImageLoading для картинок), но результат почти не заметен.

Код страницы
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
using System.Collections.Generic;
using FFImageLoading.Forms;
using ScrollList.ViewModels;
using Xamarin.Forms;
 
namespace ScrollList
{
    public partial class MainPage : ContentPage
    {
        public MainPage()
        {
            InitializeComponent();
            var listView = new ListView()
            {
                HasUnevenRows = true,
                ItemTemplate = new DataTemplate(typeof(CustomProfileCell)),
                SeparatorVisibility = SeparatorVisibility.None
            };
            Content = listView;
 
            listView.ItemsSource = posts;
        }
 
        async void WallItemTapped(object sender, ItemTappedEventArgs e)
        {
 
        }
    }
 
    public class PostStackLayout : StackLayout
    {
        private Grid _imageGridLayout = null;
 
        protected override void OnBindingContextChanged()
        {
            var wallPostViewModel = (MainPageViewModel)BindingContext;
            switch (wallPostViewModel.Images.Count)
            {
                case 1:
                    _imageGridLayout = GetGridOnePhoto(wallPostViewModel);
                    break;
 
                case 2:
                    _imageGridLayout = GetGridTwoPhotos(wallPostViewModel);
                    break;
 
                case 3:
                    _imageGridLayout = GetGridThreePhotos(wallPostViewModel);
                    break;
 
             // skip some code
 
                case 8:
                    _imageGridLayout = GetGridEightPhotos(wallPostViewModel);
                    break;
            }
 
            Children.Add(_imageGridLayout);
        }
 
        private Grid GetGridOnePhoto(MainPageViewModel model)
        {
            var postImage1_0 = new CachedImage
            {
                Aspect = Aspect.AspectFit,
                HorizontalOptions = LayoutOptions.FillAndExpand,
                VerticalOptions = LayoutOptions.FillAndExpand,
                Source = model.Images[0]
            };
            //Image grids for 1 post images
            _imageGridLayout = new Grid()
            {
                ColumnDefinitions = new ColumnDefinitionCollection
                {
                    new ColumnDefinition {Width = new GridLength(1, GridUnitType.Auto)}
                },
                RowDefinitions = new RowDefinitionCollection
                {
                    new RowDefinition {Height = new GridLength(1, GridUnitType.Auto)}
                }
            };
            _imageGridLayout.Children.Add(postImage1_0, 0, 0);
            return _imageGridLayout;
        }
 
        private Grid GetGridTwoPhotos(MainPageViewModel model)
        {
            var postImage2_0 = new CachedImage
            {
                Aspect = Aspect.AspectFit,
                HorizontalOptions = LayoutOptions.FillAndExpand,
                VerticalOptions = LayoutOptions.FillAndExpand,
                Source = model.Images[0],
            };
            var postImage2_1 = new CachedImage
            {
                Aspect = Aspect.AspectFit,
                HorizontalOptions = LayoutOptions.FillAndExpand,
                VerticalOptions = LayoutOptions.FillAndExpand,
                Source = model.Images[1],
            };
            //Image grids for 2 post images
            _imageGridLayout = new Grid()
            {
                ColumnDefinitions = new ColumnDefinitionCollection
                {
                    new ColumnDefinition {Width = new GridLength(1, GridUnitType.Star)},
                    new ColumnDefinition {Width = new GridLength(1, GridUnitType.Star)}
                },
                RowDefinitions = new RowDefinitionCollection
                {
                    new RowDefinition {Height = new GridLength(1, GridUnitType.Auto)}
                }
            };
            _imageGridLayout.Children.Add(postImage2_0, 0, 0);
            _imageGridLayout.Children.Add(postImage2_1, 1, 0);
            return _imageGridLayout;
        }
 
        private Grid GetGridThreePhotos(MainPageViewModel model)
        {
            var postImage3_0 = new CachedImage
            {
                Aspect = Aspect.AspectFit,
                HorizontalOptions = LayoutOptions.FillAndExpand,
                VerticalOptions = LayoutOptions.FillAndExpand,
                Source = model.Images[0],
            };
            var postImage3_1 = new CachedImage
            {
                Aspect = Aspect.AspectFit,
                HorizontalOptions = LayoutOptions.FillAndExpand,
                VerticalOptions = LayoutOptions.FillAndExpand,
                Source = model.Images[1],
            };
            var postImage3_2 = new CachedImage
            {
                Aspect = Aspect.AspectFit,
                HorizontalOptions = LayoutOptions.FillAndExpand,
                VerticalOptions = LayoutOptions.FillAndExpand,
                Source = model.Images[2],
            };
            //Image grids for 3 post images
            _imageGridLayout = new Grid()
            {
                ColumnDefinitions = new ColumnDefinitionCollection
                {
                    new ColumnDefinition {Width = new GridLength(1, GridUnitType.Star)},
                    new ColumnDefinition {Width = new GridLength(1, GridUnitType.Star)}
                },
                RowDefinitions = new RowDefinitionCollection
                {
                    new RowDefinition {Height = new GridLength(1, GridUnitType.Auto)},
                    new RowDefinition {Height = new GridLength(1, GridUnitType.Auto)}
                },
            };
            _imageGridLayout.Children.Add(postImage3_0, 0, 2, 0, 1);
            _imageGridLayout.Children.Add(postImage3_1, 0, 1);
            _imageGridLayout.Children.Add(postImage3_2, 1, 1);
            return _imageGridLayout;
        }
 
        // skip some code
        private Grid GetGridEightPhotos(MainPageViewModel model)
        {
            var postImage8_0 = new CachedImage
            {
                Aspect = Aspect.AspectFit,
                HorizontalOptions = LayoutOptions.FillAndExpand,
                VerticalOptions = LayoutOptions.FillAndExpand,
                Source = model.Images[0],
            };
            var postImage8_1 = new CachedImage
            {
                Aspect = Aspect.AspectFit,
                HorizontalOptions = LayoutOptions.FillAndExpand,
                VerticalOptions = LayoutOptions.FillAndExpand,
                Source = model.Images[1],
            };
            var postImage8_2 = new CachedImage
            {
                Aspect = Aspect.AspectFit,
                HorizontalOptions = LayoutOptions.FillAndExpand,
                VerticalOptions = LayoutOptions.FillAndExpand,
                Source = model.Images[2],
            };
            var postImage8_3 = new CachedImage
            {
                Aspect = Aspect.AspectFit,
                HorizontalOptions = LayoutOptions.FillAndExpand,
                VerticalOptions = LayoutOptions.FillAndExpand,
                Source = model.Images[3],
            };
            var postImage8_4 = new CachedImage
            {
                Aspect = Aspect.AspectFit,
                HorizontalOptions = LayoutOptions.FillAndExpand,
                VerticalOptions = LayoutOptions.FillAndExpand,
                Source = model.Images[4],
            };
            var postImage8_5 = new CachedImage
            {
                Aspect = Aspect.AspectFit,
                HorizontalOptions = LayoutOptions.FillAndExpand,
                VerticalOptions = LayoutOptions.FillAndExpand,
                Source = model.Images[5],
            };
            var postImage8_6 = new CachedImage
            {
                Aspect = Aspect.AspectFit,
                HorizontalOptions = LayoutOptions.FillAndExpand,
                VerticalOptions = LayoutOptions.FillAndExpand,
                Source = model.Images[6],
            };
            var postImage8_7 = new CachedImage
            {
                Aspect = Aspect.AspectFit,
                HorizontalOptions = LayoutOptions.FillAndExpand,
                VerticalOptions = LayoutOptions.FillAndExpand,
                Source = model.Images[7],
            };
            //Image grids for 8 post images
            _imageGridLayout = new Grid
            {
                ColumnDefinitions = new ColumnDefinitionCollection
                {
                    new ColumnDefinition {Width = new GridLength(1, GridUnitType.Star)},
                    new ColumnDefinition {Width = new GridLength(1, GridUnitType.Star)},
                    new ColumnDefinition {Width = new GridLength(1, GridUnitType.Star)},
                    new ColumnDefinition {Width = new GridLength(1, GridUnitType.Star)}
                },
                RowDefinitions = new RowDefinitionCollection
                {
                    new RowDefinition {Height = new GridLength(1, GridUnitType.Auto)},
                    new RowDefinition {Height = new GridLength(1, GridUnitType.Auto)}
                }
            };
            _imageGridLayout.Children.Add(postImage8_0, 0, 0);
            _imageGridLayout.Children.Add(postImage8_1, 1, 0);
            _imageGridLayout.Children.Add(postImage8_2, 2, 0);
            _imageGridLayout.Children.Add(postImage8_3, 3, 0);
            _imageGridLayout.Children.Add(postImage8_4, 0, 1);
            _imageGridLayout.Children.Add(postImage8_5, 1, 1);
            _imageGridLayout.Children.Add(postImage8_6, 2, 1);
            _imageGridLayout.Children.Add(postImage8_7, 3, 1);
            return _imageGridLayout;
        }
    }
 
    public class CustomProfileCell : ViewCell
    {
        public CustomProfileCell()
        {
            //mainLayout
            StackLayout mainLayout = new StackLayout() { Padding = new Thickness(0, 0, 0, 8) };
            Grid postGrid = new Grid
            {
                BackgroundColor = Color.White,
                Padding = new Thickness(10, 5, 10, 5),
                ColumnDefinitions = new ColumnDefinitionCollection
                {
                    new ColumnDefinition {Width = GridLength.Auto},
                    new ColumnDefinition {Width = new GridLength(1, GridUnitType.Star)}
                },
                RowDefinitions = new RowDefinitionCollection
                {
                    new RowDefinition {Height = GridLength.Auto},
                    new RowDefinition {Height = GridLength.Auto},
                    new RowDefinition {Height = GridLength.Auto}
                }
            };
            mainLayout.Children.Add(postGrid);
 
            //Avatar Layout
            var avatarLayout = new StackLayout();
            postGrid.Children.Add(avatarLayout, 0, 0);
 
            var avatarImage = new Image
            {
                Aspect = Aspect.AspectFill,
                WidthRequest = Device.OnPlatform(55, 55, 75),
                HeightRequest = Device.OnPlatform(55, 55, 75)
            };
            avatarImage.SetBinding(Image.SourceProperty, new Binding("UserImage"));
            avatarLayout.Children.Add(avatarImage);
 
            //User Name Layout
            var userNameLayout = new StackLayout();
            postGrid.Children.Add(userNameLayout, 1, 0);
            var userNameLabel = new Label()
            {
                TextColor = Color.Black
            };
            userNameLabel.SetBinding(Label.TextProperty, new Binding("UserName"));
            userNameLayout.Children.Add(userNameLabel);
 
            //Post Text Layout
            var textLayout = new StackLayout();
            var textLabel = new Label()
            {
                TextColor = Color.Black
            };
            textLabel.SetBinding(Label.TextProperty, new Binding("Text"));
            textLayout.Children.Add(textLabel);
            postGrid.Children.Add(textLayout, 0, 2, 1, 2);
 
            //insert photos
            var postStackLayout = new PostStackLayout();
            postGrid.Children.Add(postStackLayout, 0, 2, 2, 3);
 
            this.View = mainLayout;
        }
    }
 }
Сам скрол:
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
23.08.2016, 15:31     Скролинг в listview
Посмотрите здесь:

Заполнение ListView с XML - Xamarin
Здравствуйте, мне нужна помощь, не могу понять как заполнить ListView с XML файла скаченного с интернета, я его распарсил, а вот добавить...

Отображение массива строк в ListView - Xamarin
Здравствуйте, купил телефон на android решил что-нить написать возникла такая проблема : есть listview и есть массив строк s (в...

Как заполнить ListView данными из Класса - Xamarin
Здравствуйте. Срочно нужна помощь. Имею программу, которую берет объекты класса из WebApi. После чего они сохраняются в переменную типа...

Как получить правильную позицию в ListView в GetView адаптера? - Xamarin
Я создал список ListView с SeekBar, но когда ловлю событие ProgressChanged в адаптере: public override View GetView(int position, View...

listview и скролинг - C#
Использую его вместо лист бокса. Но строчки слишком длинные. Как сделать скролл по горизонтали чтоб можно было стрелочками листать?

Скролинг - C#
Добрый день. У меня на форме имеется две панели, panel1, panel2. panel1 находиться внутри panel2 и имеет свойство AutoSize = True, а panel2...

скролинг - jQuery
Здравствуйте, подскажите пожалуйста, как сделать много-уровненный скролинг по типу как этом сайте, как это называется, куда копать. ...

Скролинг - C++
Как в консоле можно создать скролинг?

Скролинг картинок - Программирование iOS
Здравствуйте. Подскажите как правильно сделать процесс листания картинок. Я просто видел несколько вариантов реализации и через...

Скролинг с GLFW - OpenGL
Здравствуйте, в общем интересует пример использования скроллинга мыши с использованием функции glfwSetScrollCallback() Не могу понять...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru