Почему мои элементы списка автоматически становятся белыми?

#.net #xaml #xamarin #xamarin.forms #xamarin.android

Вопрос:

Поэтому я работаю над приложением, которое будет отображать примерно 25 элементов в a ListView . Когда приложение загружается, первые три элемента загружаются просто отлично, но 4-й и некоторые другие полностью белые и даже не становятся того цвета, каким они должны быть. если я прокручу список вниз и пару раз сделаю резервную копию, все они станут белыми и никогда не вернутся к своему первоначальному цвету. Почему это так и что я могу сделать, чтобы предотвратить это? Должен ли я использовать другой элемент управления для отображения элементов?

Я установил для некоторых свойств пустые строки, потому что не хочу делиться этими данными с общественностью. Это никак не влияет на пример, привязка работает идеально, как и должно быть.

Вот как это выглядит

введите описание изображения здесь

 <ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             xmlns:viewModel="clr-namespace:MaterialDesign.MVVM.ViewModel"
             x:Class="MaterialDesign.MainPage">
    <ContentPage.BindingContext>
        <viewModel:HomeViewModel/>
    </ContentPage.BindingContext>

    <StackLayout Background="#282828">

        <ListView ItemsSource="{Binding Items}"
                  HasUnevenRows="True"
                  Margin="0,10,0,0">
            <ListView.ItemTemplate>
                <DataTemplate>
                    <ViewCell>

                        <Frame Background="#302E2E"
                               Margin="10,10,10,20"
                               Padding="0"
                               CornerRadius="4">
                            <StackLayout>
                                <Image HeightRequest="200"
                                       Source="{Binding ThePicture}"
                                       Aspect="Fill"
                                       IsAnimationPlaying="True"/>

                                <StackLayout Margin="10">

                                    <Label Text="{Binding Name}"
                                           TextColor="#F9F9F9"
                                           FontFamily="RobotoRegular"
                                           Margin="5,0,0,0"/>

                                    <Label Text="{Binding Name}"
                                           TextColor="#F9F9F9"
                                           FontFamily="RobotoRegular"
                                           Margin="5,0,0,0"/>

                                    <Label Text="{Binding Name}"
                                           FontFamily="RobotoMedium"
                                           FontSize="20"
                                           TextColor="#F9F9F9"
                                           Margin="5,0,0,0"/>

                                    <Label Text="{Binding Name}"
                                           FontFamily="RobotoMedium"
                                           FontSize="20"
                                           TextColor="#F9F9F9"
                                           Margin="5,0,0,0"/>

                                    <Label Text="{Binding Name}"
                                           TextColor="#929292"
                                           FontFamily="RobotoRegular"
                                           Margin="5,0,0,0"/>

                                    <FlexLayout BindableLayout.ItemsSource="{Binding Names}"
                                                BindableLayout.ItemTemplate="{StaticResource T}"
                                                Wrap="Wrap"
                                                Direction="row"
                                                FlowDirection="LeftToRight"
                                                AlignItems="Start"
                                                AlignContent="Start"
                                                Padding="0"
                                                Margin="0">

                                    </FlexLayout>
                                </StackLayout>
                            </StackLayout>
                        </Frame>

                    </ViewCell>
                </DataTemplate>
            </ListView.ItemTemplate>
        </ListView>
    </StackLayout>
</ContentPage>
 

Комментарии:

1. Не могли бы вы также опубликовать код о «предметах» позади? Также можно было бы провести тест с 5 или 6 статическими элементами в списке, чтобы увидеть результат.

2. посмотрите на настройки кэширования для ListView и подумайте о переключении на CollectionView

3. Привет, установите CachingStrategy=»RecycleElement»

4. Попробуйте заменить элемент управления кадром сеткой. Каждый раз, когда я использую фрейм, у меня возникают проблемы с пользовательским интерфейсом.

Ответ №1:

Не используйте управление кадром.

Попробуйте выполнить следующий код с помощью https://github.com/sthewissen/Xamarin.Формы.Блинный вид

 xmlns:yummy="clr-namespace:Xamarin.Forms.PancakeView;assembly=Xamarin.Forms.PancakeView"


<yummy:PancakeView
            Background="#302E2E"
                           Margin="10,10,10,20"
                           Padding="0"
                           CornerRadius="4">
            <StackLayout>
                            <Image HeightRequest="200"
                                   Source="{Binding ThePicture}"
                                   Aspect="Fill"
                                   IsAnimationPlaying="True"/>

                            <StackLayout Margin="10">

                                <Label Text="{Binding Name}"
                                       TextColor="#F9F9F9"
                                       FontFamily="RobotoRegular"
                                       Margin="5,0,0,0"/>

                                <Label Text="{Binding Name}"
                                       TextColor="#F9F9F9"
                                       FontFamily="RobotoRegular"
                                       Margin="5,0,0,0"/>

                                <Label Text="{Binding Name}"
                                       FontFamily="RobotoMedium"
                                       FontSize="20"
                                       TextColor="#F9F9F9"
                                       Margin="5,0,0,0"/>

                                <Label Text="{Binding Name}"
                                       FontFamily="RobotoMedium"
                                       FontSize="20"
                                       TextColor="#F9F9F9"
                                       Margin="5,0,0,0"/>

                                <Label Text="{Binding Name}"
                                       TextColor="#929292"
                                       FontFamily="RobotoRegular"
                                       Margin="5,0,0,0"/>

                                <FlexLayout BindableLayout.ItemsSource="{Binding Names}"
                                            BindableLayout.ItemTemplate="{StaticResource T}"
                                            Wrap="Wrap"
                                            Direction="row"
                                            FlowDirection="LeftToRight"
                                            AlignItems="Start"
                                            AlignContent="Start"
                                            Padding="0"
                                            Margin="0">

                                </FlexLayout>
                            </StackLayout>
                        </StackLayout>
        </yummy:PancakeView>
 

Ответ №2:

Вы можете просто использовать ListView в качестве ретранслятора. Вам не нужны накладные расходы на представление списка. Вы можете прочитать больше здесь

 <StackLayout BindableLayout.ItemsSource="{Binding Items}"
             Margin="0,10,0,0">
    <BindableLayout.ItemTemplate>
        <DataTemplate>
            <Frame Background="#302E2E"
                   Margin="10,10,10,20"
                   Padding="0"
                   CornerRadius="4">
                <StackLayout>
                    <Image HeightRequest="200"
                           Source="{Binding ThePicture}"
                           Aspect="Fill"
                           IsAnimationPlaying="True"/>

                    <StackLayout Margin="10">

                        <Label Text="{Binding Name}"
                               TextColor="#F9F9F9"
                               FontFamily="RobotoRegular"
                               Margin="5,0,0,0"/>

                        <Label Text="{Binding Name}"
                               TextColor="#F9F9F9"
                               FontFamily="RobotoRegular"
                               Margin="5,0,0,0"/>

                         <Label Text="{Binding Name}"
                                FontFamily="RobotoMedium"
                                FontSize="20"
                                TextColor="#F9F9F9"
                                Margin="5,0,0,0"/>

                        <Label Text="{Binding Name}"
                               FontFamily="RobotoMedium"
                               FontSize="20"
                               TextColor="#F9F9F9"
                               Margin="5,0,0,0"/>

                        <Label Text="{Binding Name}"
                               TextColor="#929292"
                               FontFamily="RobotoRegular"
                               Margin="5,0,0,0"/>

                        <FlexLayout BindableLayout.ItemsSource="{Binding Names}"
                                    BindableLayout.ItemTemplate="{StaticResource T}"
                                   Wrap="Wrap"
                                   Direction="row"
                                   FlowDirection="LeftToRight"
                                   AlignItems="Start"
                                   AlignContent="Start"
                                   Padding="0"
                                   Margin="0">

                        </FlexLayout>
                    </StackLayout>
                </StackLayout>
            </Frame>
         </DataTemplate>
    </BindableLayout.ItemTemplate>
 </StackLayout>