2016-09-15 3 views
9

Ich habe meine Fragmente innerhalb der Ansicht Seite, aber ich möchte die Daten auf der ausgewählten Registerkarte neu laden.Ich versuchte PositionNone in der GetItemPosition Methode in meinem FragmentPagerAdapter, aber es funktioniert nicht .Reload Daten auf Registerkarte ausgewählt in einem Fragment mit Ansicht Pager

Ich habe versucht, notifyDataSetChanged(); auf der Registerkarte ausgewählt, aber es löst nullpointer Ausnahme. Ich habe sogar versucht, die viewPager.setOffscreenPageLimit Ich habe es geschafft, den Link zu finden: Replace Fragment inside a ViewPager aber es ist auf Java. Ich habe es geschafft, den größten Teil des Codes in C# zu konvertieren, bleibt aber auf dem kommentierten Code hängen. Ich bin mir nicht sicher, wie ich den Hörer anrufen und die Klasse zur gleichen Zeit instanziieren soll. Es gibt viele ähnliche Fragen, aber leider keine in Xamarin Android.

Ich muss dies in Xamarin Android tun. Jede Hilfe wird sehr geschätzt.

Das ist mein FragmentAdapter

public class TabsFragmentPagerAdapter : FragmentPagerAdapter 
{ 
    private readonly Android.Support.V4.App.Fragment[] fragments; 
    static readonly int NUM_ITEMS = 2; 
    private readonly Android.Support.V4.App.FragmentManager FragmentManager; 
    private Android.Support.V4.App.Fragment mFragmentAtPos0; 
    private readonly ICharSequence[] titles; 

    public TabsFragmentPagerAdapter(Android.Support.V4.App.FragmentManager fm, Android.Support.V4.App.Fragment[] fragments, ICharSequence[] titles) : base(fm) 
    { 
     this.fragments = fragments; 
     this.titles = titles; 

    } 
    public override int Count 
    { 
     get 
     { 
      return fragments.Length; 
     } 
    } 

    public override int GetItemPosition(Java.Lang.Object objectValue) 
    { 
     if (objectValue.GetType() == typeof(startJobFrag) && mFragmentAtPos0.GetType() == typeof(jobCaptureFrag)) 
     { 
      return PositionNone; 
     } 
     return PositionUnchanged; 
    } 


    public override ICharSequence GetPageTitleFormatted(int position) 
    { 
     return titles[position]; 
    } 


    public override Android.Support.V4.App.Fragment GetItem(int position) 
    { 
     if (position == 0) 
     { 
      if (mFragmentAtPos0 == null) 
      { 
       //not working 
      } 
      return mFragmentAtPos0; 
     } 
     else 
     { 
      return new jobCaptureFrag(); 
     } 
    } 

Das ist mein actvity ist

void FnInitTabLayout() 
    { 
     var fragments = new Android.Support.V4.App.Fragment[] 
     { 
new frag 1(), 
new frag 2(), 
new frag 3(), 
     }; 

     //Tab title array 
     var titles = CharSequence.ArrayFromStringArray(new[] { 
    "Page 1", 
    "Page 2", 
    "Page 3", 
    }); 

     var viewPager = FindViewById<ViewPager>(Resource.Id.viewpager); 
     //viewpager holding fragment array and tab title text 
     //viewPager. 
     viewPager.Adapter = new TabsFragmentPagerAdapter(SupportFragmentManager, fragments, titles); 

     // Give the TabLayout the ViewPager 
     tabLayout.SetupWithViewPager(viewPager); 

     viewPager.PageSelected += (object sender, ViewPager.PageSelectedEventArgs e) => 
     { 
      //FnInitTabLayout(); 
      if(e.Position == 0) 
      { 
       //handle tab click/selected 

      } 
     }; 
} 

public interface FirstPageFragmentListener 
{ 
    void onSwitchToNextFragment(); 
} 

Fragment

public class Fragment1: Android.Support.V4.App.Fragment 
{   
    public override void OnCreate(Bundle savedInstanceState) 
    { 
     base.OnCreate(savedInstanceState); 

     // Create your fragment here 
    } 

    public override View OnCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) 
    { 
     // Use this to return your custom view for this Fragment 
     // return inflater.Inflate(Resource.Layout.YourFragment, container, false); 

     View view = inflater.Inflate(Resource.Layout.myview, container, false); 

    } 
} 
+2

weiß nicht über xamairn, aber versuchen Sie es zu sehenPage.setOffscopePageLimit (0) –

+0

Hinweis: Überprüfen Sie in Ihrem Fragment, ob es sichtbar ist. Wenn dies der Fall ist, rufen Sie an, um Daten zu laden. – anstaendig

+0

@anstaendig Ich habe versucht, die Daten zu laden, aber Null Ausnahme –

Antwort

6

ich es geschafft, es auf eigene Faust zu lösen. In Meine Tätigkeit rief ich NotifyDataSetChanged() auf Pageselected Ereignis

Aktivität

ViewPager.PageSelected += (object sender,     ViewPager.PageSelectedEventArgs e) => 
     { 
      if (e.Position == 1) 
      { 
       _pager.Adapter.NotifyDataSetChanged(); 
      } 
     }; 

Dann änderte ich meine Adapter FragmentPagerAdapter-FragmentStatePagerAdapter und die GetItemPosition außer Kraft setzen.

Adapter

public class TabsFragmentPagerAdapter : FragmentStatePagerAdapter 
    { 
     public override int GetItemPosition(Java.Lang.Object objectValue) 
     { 
      return PositionNone; 
     } 
    } 

eine bestimmte Registerkarte Aktualisieren - innerhalb des Adapters

public override Android.Support.V4.App.Fragment GetItem(int position) 
    { 
     if(position == 1) //second tab selected 
     { 
      NotifyDataSetChanged(); 
     }    
     return fragments[position]; 
    } 

Ich bin sicher, es gibt einen besseren Weg, es zu tun, aber das funktioniert.

+0

Gibt es eine Möglichkeit, nur ein Fragment und nicht den gesamten Viewpager zu aktualisieren? – CDrosos

+0

@CDrosos Ich habe meine Antwort aktualisiert. Hör zu. –

Verwandte Themen