2016-04-21 13 views
7

Ich habe Probleme beim Scrollen an den Anfang eines ListView in Xamarin Forms. Ich kann zum ersten Element blättern, indem ich ScrollTo aufrufe und das erste Element übergebe. Das Problem ist, dass, wenn die Liste ein Header-Element hat, ich keinen Weg finden kann, um zum Header zu blättern. Ist das möglich? Die einzige Arbeit, die ich mir vorstellen kann, ist, nicht die Kopfzeile zu verwenden und nur ein anderes Element am Anfang der ItemSource-Liste zu haben, das als Kopfzeile dient, aber ich würde lieber die Kopfzeile verwenden, wenn möglich. Vielen Dank.Scrollen zum Start von Xamarin Forms ListView mit Header

Antwort

11

Also ich habe das jetzt selbst gelöst. Meine Lösung bestand darin, ListView abzuleiten und eine öffentliche ScrollToTop-Methode hinzuzufügen, die beim Aufruf ein internes ScrollToTopRequestedEvent aufruft. Ich habe dann den ListViewRenderer auf jeder Plattform subclassiert und für das Ereignis registriert.

Im Android-Renderer rufe ich dann Control.SmoothScrollToPositionFromTop (0, 0), um nach oben zu scrollen.

In der iOS gerendert rufen ich Control.ScrollRectToVisible (neue CoreGraphics.CGRect (0, 0, 1, 1), wahr).

+0

Dank Gareth, die mich auf den richtigen Weg gebracht! Ich endete mit einer Aktion anstelle eines Ereignisses, aber das funktioniert perfekt;) – wislon

+0

Können Sie bitte den Code zur Verfügung stellen? Ich bin Android Entwickler und Neuling in Xamarin :) – AlirezaXX

+0

@ AlirezaXX bitte überprüfen Code in meiner Antwort unter –

2

Wah alle Kredite @Gareth Wynn, Mann, das war cool thx. Auf jeden Fall hier ist der Code für alle zu verwenden, ändern Klassennamen und Namespace, iOS nicht enthalten, da für Android gleiche tun, nur Gareth Wynn Hinweis parallel Antwort mit:

NiftyListView.cs GEMEINSAM:

 using System; 
     using Xamarin.Forms; 

      namespace AppoMobi 
      { 
       public class NiftyListView : CListView 
       { 
        public event EventHandler EventScrollToTop; 

        //------------------------------------------------------------------- 
        public void ScrollToTop(bool animate=true) 
        //------------------------------------------------------------------- 
        { 
         //bool animate is not used at this stage, it's always animated. 
         EventScrollToTop?.Invoke(this, EventArgs.Empty); 
        } 
       } 
      } 

ANDROID NiftyListView.Android.cs :

using System; 
using AppoMobi; 
using AppoMobi.Droid.Renderers; 
using Xamarin.Forms; 
using Xamarin.Forms.Platform.Android; 
using ListView = Xamarin.Forms.ListView; 

[assembly: ExportRenderer(typeof(NiftyListView), typeof(NiftyListViewRenderer))] 
namespace AppoMobi.Droid.Renderers 
{ 
    //------------------------------------------------------------------- 
    class NiftyListViewRenderer : ListViewRenderer 
    //------------------------------------------------------------------- 
    { 
     protected override void OnElementChanged(ElementChangedEventArgs<ListView> e) 
     { 
      base.OnElementChanged(e); 

      var view = (NiftyListView)Element; 
      if (view == null) return; 

      view.EventScrollToTop += OnScrollToTop; 

     } 

     //------------------------------------------------------------------------------------------- 
     public async void OnScrollToTop(object sender, EventArgs eventArgs) 
     //------------------------------------------------------------------------------------------- 
     { 
      Control.SmoothScrollToPositionFromTop(0, 0); 
     } 

    } 
} 
+0

Hey, es ist toll, dass Sie den Code geteilt haben. Aus dem Gedächtnis denke ich, dass SmoothScroll für Listen mit einer großen Anzahl von Elementen ziemlich langsam ist. Ich tauschte es gegen eine andere Methode, aber ich erinnere mich nicht, was es war. Ich werde sehen, ob ich meinen Code ausgraben und auch posten kann. –

Verwandte Themen