2016-09-15 17 views
9

mam fragmenty wewnątrz widoku strony, ale chciałbym, aby przeładować dane na karcie selected.I wypróbowane powracającego PositionNone w metodzie GetItemPosition w moim FragmentPagerAdapter ale to nie działa .Odśwież dane na karcie wybrany fragment widoku za pomocą pagera

Próbowałem dodać notifyDataSetChanged(); na wybranej karcie, ale spowoduje to zgłoszenie wyjątku nullpointer. Próbowałem nawet ustawić viewPager.setOffscreenPageLimit Udało mi się znaleźć łącze: Replace Fragment inside a ViewPager , ale jest na java. Udało mi się przekonwertować większość kodu na C#, ale utknęło na skomentowanym kodzie. Nie jestem pewien, jak zadzwonić do słuchacza i utworzyć instancję w tym samym czasie? Jest wiele podobnych pytań, ale niestety nie jeden w Xamarin Android.

Muszę to zrobić w Androidzie xamarin. Każda pomoc zostanie bardzo doceniona.

To mój 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(); 
     } 
    } 

To mój Actvity

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

Nie wiem o xamairn, ale spróbuj wyświetlićPage.setOffscreenPageLimit (0) –

+0

Wskazówka: Wewnątrz fragmentu sprawdź, czy jest widoczny. Jeśli tak, zadzwoń, aby załadować dane. – anstaendig

+0

@anstaendig Próbowałem załadować dane, ale otrzymałem zerowy wyjątek –

Odpowiedz

6

udało mi się go rozwiązać na własną rękę. W mojej działalności Zadzwoniłem NotifyDataSetChanged() na razie Pageselected

aktywny

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

Potem zmieniłem zasilacz z FragmentPagerAdapter do FragmentStatePagerAdapter i zastąpić GetItemPosition.

Adapter

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

Odśwież konkretną kartę - wewnątrz zasilacza

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

Jestem pewien, że istnieje lepszy sposób to zrobić, ale to działa.

+0

Czy istnieje sposób na odświeżenie tylko jednego fragmentu, a nie całego podglądu? – CDrosos

+0

@CDrosos Zaktualizowałem moją odpowiedź. Sprawdź to. –

Powiązane problemy