xamarin/Xamarin.Forms

ListView item hidden holds space

オープン

#5,648 opened on 2019/03/21

 (8 件のコメント) (0 件のリアクション) (0 人の担当者)C# (1,926 件のフォーク)batch import
a/listviewe/4 :clock4:help wantedp/Androidt/bug :bug:up-for-grabs

Repository metrics

Stars
 (5,644 個のスター)
PR merge metrics
 (30d に merged PR はありません)

説明

Description

When a Item gets hidden it doesn't free its space and It is still seleccionable. It works fine in UWP but not in Android.

Steps to Reproduce

Having this XAML

<ContentPage>
        <Grid VerticalOptions="Center"
              HorizontalOptions="Center">
            <StackLayout Orientation="Horizontal">
                <ListView WidthRequest="400" SelectionMode="Single" HorizontalOptions="Center" ItemsSource="{Binding ObservableCollectionTest}" BackgroundColor="Green">
                    <ListView.ItemTemplate>
                        <DataTemplate>
                            <ViewCell>
                                <Grid RowSpacing="0"
                                      ColumnSpacing="0"
                                      Padding="0"
                                      Margin="0"
                                      HeightRequest="{Binding IsVisible,Converter={StaticResource BoolToHeight},Mode=OneWay, ConverterParameter=-1}"
                                      IsVisible="{Binding IsVisible}"
                                      BackgroundColor="Yellow">
                                    <Label IsVisible="{Binding IsVisible}"
                                           Text="{Binding Text}" />
                                </Grid>
                            </ViewCell>
                        </DataTemplate>
                    </ListView.ItemTemplate>
                </ListView>
                <Button BackgroundColor="Gray" VerticalOptions="Center" Text="Hide some Items" Clicked="Button_Clicked"></Button>
            </StackLayout>
        </Grid>
    </ContentPage>

xaml.cs : (Clicked event)

 private void Button_Clicked(object sender, EventArgs e)
        {
            var viewModel = this.BindingContext as MainPageViewModel;
            viewModel.ObservableCollectionTest[1].IsVisible = !viewModel.ObservableCollectionTest[1].IsVisible;
            viewModel.ObservableCollectionTest[2].IsVisible = !viewModel.ObservableCollectionTest[2].IsVisible;
            viewModel.ObservableCollectionTest[3].IsVisible = !viewModel.ObservableCollectionTest[3].IsVisible;
            viewModel.ObservableCollectionTest[4].IsVisible = !viewModel.ObservableCollectionTest[4].IsVisible;
            viewModel.ObservableCollectionTest[5].IsVisible = !viewModel.ObservableCollectionTest[5].IsVisible;
            viewModel.ObservableCollectionTest[6].IsVisible = !viewModel.ObservableCollectionTest[6].IsVisible;
            viewModel.ObservableCollectionTest[7].IsVisible = !viewModel.ObservableCollectionTest[7].IsVisible;
            viewModel.ObservableCollectionTest[8].IsVisible = !viewModel.ObservableCollectionTest[8].IsVisible;
            viewModel.ObservableCollectionTest[9].IsVisible = !viewModel.ObservableCollectionTest[9].IsVisible;
            viewModel.ObservableCollectionTest[10].IsVisible = !viewModel.ObservableCollectionTest[10].IsVisible;
            viewModel.ObservableCollectionTest[11].IsVisible = !viewModel.ObservableCollectionTest[11].IsVisible;
            viewModel.ObservableCollectionTest[12].IsVisible = !viewModel.ObservableCollectionTest[12].IsVisible;
            viewModel.ObservableCollectionTest[13].IsVisible = !viewModel.ObservableCollectionTest[13].IsVisible;
            viewModel.ObservableCollectionTest[14].IsVisible = !viewModel.ObservableCollectionTest[14].IsVisible;
            viewModel.ObservableCollectionTest[15].IsVisible = !viewModel.ObservableCollectionTest[15].IsVisible;
            viewModel.ObservableCollectionTest[16].IsVisible = !viewModel.ObservableCollectionTest[16].IsVisible;
            viewModel.ObservableCollectionTest[17].IsVisible = !viewModel.ObservableCollectionTest[17].IsVisible;
            viewModel.ObservableCollectionTest[18].IsVisible = !viewModel.ObservableCollectionTest[18].IsVisible;
            viewModel.ObservableCollectionTest[19].IsVisible = !viewModel.ObservableCollectionTest[19].IsVisible;
            viewModel.ObservableCollectionTest[20].IsVisible = !viewModel.ObservableCollectionTest[20].IsVisible;
        }

VM:

public static string ObservableCollectionTestPropertyName() { return nameof(ObservableCollectionTest); }
        private ObservableCollection<Item> _ObservableCollectionTest = new ObservableCollection<Item>(new List<Item>()
        {
            new Item("test 1")
            , new Item("test 2")
            , new Item("test 3")
            , new Item("test 4")
            , new Item("test 5")
            , new Item("test 6")
            , new Item("test 7")
            , new Item("test 8")
            , new Item("test 9")
            , new Item("test 10")
            , new Item("test 11")
            , new Item("test 12")
            , new Item("test 13")
            , new Item("test 14")
            , new Item("test 15")
            , new Item("test 16")
            , new Item("test 17")
            , new Item("test 18")
            , new Item("test 19")
            , new Item("test 20")
            , new Item("test 21")
            , new Item("test 22")
            , new Item("test 24")
            , new Item("test 25")
            , new Item("test 26")
            , new Item("test 27")
            , new Item("test 28")
            , new Item("test 29")
            , new Item("test 30")
            , new Item("test 31")
            , new Item("test 32")
            , new Item("test 33")
            , new Item("test 34")
            , new Item("test 35")
            , new Item("test 36")
            , new Item("test 37")
            , new Item("test 38")
            , new Item("test 39")
            , new Item("test 40")
        });
        public ObservableCollection<Item> ObservableCollectionTest
        {
            get
            {
                return _ObservableCollectionTest;
            }
            set
            {
                _ObservableCollectionTest = value;
                RaisePropertyChanged();
            }
        }

BoolToHeight converter:

public class BoolToHeight : IValueConverter
    {
        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
        {
            if (value != null) {
                if ((bool)value) {
                    return System.Convert.ToDouble((string)parameter);
                }
                else return 0;
            }
            else
                return 0;
        }
        public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
        {
            if ((double)value == System.Convert.ToDouble((string)parameter)) return true;
            else return false;
        }
    }

Expected Behavior

A hidden item should be not seleccionable and it should not take any space

Actual Behavior

It takes space and it is seleccionable

Basic Information

  • Version with issue: 4.0.0.250467-pre7

  • IDE: Visual Studio Community 2017 version 15.9.9

  • Platform Target Frameworks:

    • Android: 8.1

Screenshots

ListView with all items visible: image

ListView with some items hidden (the orange line is an item selected after hidding the items): image

Source code : https://github.com/psp589/XamarinFormsIssuesReproduction

コントリビューターガイド