How to set ListView to Start showing the last Item instead in Xamarin Forms?

后端 未结 1 1453
心在旅途
心在旅途 2020-12-15 13:15

I have a list of Items being handled by the ListView. By default, the ListView shows the from start to bottom (scrolling).

How do I set the ListView to start at the

1条回答
  •  时光说笑
    2020-12-15 13:48

    You can use ScrollTo in a ListView to scroll to a any position you set. You need to overwrite the OnAppearing method. This is an example for scrolling to the end of the ListView ViewModel.Messages:

    protected override void OnAppearing()
        {
            base.OnAppearing();
    
            ViewModel.RefreshScrollDown = () => {
                if (ViewModel.Messages.Count > 0) {
                    Device.BeginInvokeOnMainThread (() => {
    
                        ListViewMessages.ScrollTo (ViewModel.Messages [ViewModel.Messages.Count - 1], ScrollToPosition.End, true);
                    });
                }
            };
        }
    

    Then just call RefreshScrollDown (which is System.Action) every time you need to scroll down, e.g. when you receive a new message or when you load the chats.

    RefreshScrollDown in ViewModel:

    public System.Action RefreshScrollDown;
    

    You can get your ViewModel in code behind like this:

    private MessagePhonePageViewModel ViewModel {
        get { return BindingContext as MessagePhonePageViewModel;}
    }
    

    NOTE: There is a bug when using a fixed ListView height. When changing the HeightRequest, ScrollTo still uses the original height of the list to calculate where it scrolls to. The original height is not updated when you change the value in HeightRequest. To fix this issue:

     protected override void OnElementPropertyChanged(object sender, PropertyChangedEventArgs e)
            {
                base.OnElementPropertyChanged(sender, e);
                if (e.PropertyName == Xamarin.Forms.ListView.HeightRequestProperty.PropertyName)
                {
                    Control.LayoutParameters.Height =(int)(sender as Xamarin.Forms.ListView).HeightRequest;
                    Control.RequestLayout();
    
                }
            }  
    

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