Xamarin: Vertical alphabet Indexing (Jump List) for grouped list in Xamarin forms for Android and windows UWP

后端 未结 1 1571
暗喜
暗喜 2020-12-19 02:48

I have designed a grouped list view in Xamarin forms for ios,android and windows platform. The vertical indexing (Jump List) appears automatically in IOS when I set the Grou

相关标签:
1条回答
  • 2020-12-19 03:28

    The simplest way is to have XAML hack, if you don't want CustomRenders.

    You can wrap your ListView in a RelativeLayout with height and width equal to the parent (content page).

    For the list view use height as parent and width 90% of parent. Add a stack layout of width 10% and starting at 90% of the relative layout with height as parent. Make its orientation vertical. Add all the alphabets to the stack layout as Labels and implement its TapGesture to ScrollTo the particular position.

    Make the width 90% for Android only for iOS and windows keep it as 100%, stack layout width as 0% and IsVisible=false.

    ViewModel :

    public class JumpListViewModel : INotifyPropertyChanged
    {
        private ObservableCollection<Item> _allItems;
        private List<string> _alphabetList;
    
        public event PropertyChangedEventHandler PropertyChanged;
    
        [NotifyPropertyChangedInvocator]
        protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null) => PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    
        public JumpListViewModel()
        {
            AllItems = new ObservableCollection<Item>(new List<Item> { new Item { MyText = "1" }, new Item { MyText = "2" }, new Item { MyText = "3" } });
    
            AlphabetList = "ABCDEFGHIJKLMNOPQRSTUVWXYZ".ToCharArray().Select(x => x.ToString()).ToList();
        }
    
        public ObservableCollection<Item> AllItems
        {
            get { return _allItems; }
            set
            {
                _allItems = value;
                OnPropertyChanged();
            }
        }
    
        public List<string> AlphabetList
        {
            get { return _alphabetList; }
            set
            {
                _alphabetList = value;
                OnPropertyChanged();
            }
        }
    }
    

    View :

    <RelativeLayout VerticalOptions="FillAndExpand">
    
        <ListView VerticalOptions="FillAndExpand" HasUnevenRows="True" ItemsSource="{Binding AllItems}"
                  SeparatorColor="Transparent" SeparatorVisibility="None" BackgroundColor="Transparent"
                  RelativeLayout.HeightConstraint="{ConstraintExpression Type=RelativeToParent, Property=Height, Factor=1}">
          <RelativeLayout.WidthConstraint>
            <OnPlatform x:TypeArguments="Constraint" Android="{ConstraintExpression Type=RelativeToParent, Property=Width,Factor=0.9}"
                        iOS="{ConstraintExpression Type=RelativeToParent, Property=Width,Factor=1}"
              WinPhone="{ConstraintExpression Type=RelativeToParent, Property=Width,Factor=1}" />
          </RelativeLayout.WidthConstraint>
    
          <ListView.ItemTemplate>
            <DataTemplate>
              <ViewCell>
    
                <StackLayout HorizontalOptions="FillAndExpand" BackgroundColor="Silver">
    
                  <Label Text="{Binding MyText}" />
                  <Button Text="button" />
                  <BoxView HeightRequest="1" Color="Gray" BackgroundColor="Gray" HorizontalOptions="FillAndExpand" />
    
                </StackLayout>
    
              </ViewCell>
            </DataTemplate>
          </ListView.ItemTemplate>
        </ListView>
    
        <ListView VerticalOptions="FillAndExpand" HasUnevenRows="True" ItemsSource="{Binding AlphabetList}"
                  SeparatorColor="Transparent" SeparatorVisibility="None" BackgroundColor="Transparent"
                  RelativeLayout.HeightConstraint="{ConstraintExpression Type=RelativeToParent, Property=Height, Factor=0.9}"
          RelativeLayout.YConstraint="{ConstraintExpression Type=RelativeToParent, Property=Height, Factor=0.05}"
          RelativeLayout.XConstraint="{ConstraintExpression Type=RelativeToParent, Property=Width, Factor=0.9}">
          <RelativeLayout.WidthConstraint>
            <OnPlatform x:TypeArguments="Constraint" Android="{ConstraintExpression Type=RelativeToParent, Property=Width,Factor=0.1}"
                        iOS="{ConstraintExpression Type=RelativeToParent, Property=Width,Factor=0, Constant=0}"
              WinPhone="{ConstraintExpression Type=RelativeToParent, Property=Width,Factor=0, Constant=0}" />
          </RelativeLayout.WidthConstraint>
          <ListView.IsVisible>
            <OnPlatform x:TypeArguments="x:Boolean" WinPhone="False" iOS="False" Android="True" />
          </ListView.IsVisible>
          <ListView.ItemTemplate>
            <DataTemplate>
              <ViewCell>
                <Label Text="{Binding .}" TextColor="Red" FontSize="Micro" />
              </ViewCell>
            </DataTemplate>
          </ListView.ItemTemplate>
        </ListView>
    
      </RelativeLayout>
    

    Screenshot from Android :

    0 讨论(0)
提交回复
热议问题