2016-10-02 1 views
0

Im Register Layout mit (mit ViewPager, es Adapter ist eine Erweiterung von FragmentStatePagerAdapter und TabLayout) und im Versuch, zu Aktualisiere eine Listenansicht auf Tab2, wenn ich auf eine Schaltfläche auf Tab1 klicke. Ich mache diesen Job von der Aktivität, die den Viewpager für jetzt hält, weil ich keine andere Möglichkeit weiß, es zu tun. Die Art, wie ich es aufzufrischen ist:Nachladen/Refreshing Fragmente in ViewPager/Tab Implementierung auf ein nicht sichtbares gecached Fragmente mit benutzerdefinierten Adapter

  1. -Monitor OnTabSelected von ViewPager
  2. Wenn Visible tab2 werden, das Listview mit so etwas wie dies zu aktualisieren:

    View _list = Activity.FindViewById(Resource.Id.MessagesListView); 
    var _adapter = new MessagesAdapter(Activity, null); 
    _adapter.NotifyDataSetChanged(); 
    _adapter = new MessagesAdapter(Activity, _reviewList); 
    var _listview= (ListView)_list; 
    _listview.Adapter = _adapter; 
    _adapter.NotifyDataSetChanged(); 
    

Wie Sie könnte aus dem code verstehen, mein problem ist, dass die ListView nicht seine einzelteile ersetzt, es nur fügt sie oben in den anderen, wie kann ich die listview löschen?

Ich habe auch versucht, mit keinem Glück mit . RemoveViews (0, test.ChildCount); Mein ListView-Adapter ist eine einfache Erweiterung des BaseAdapter.

Auch wenn Sie eine andere Art des professionellen Refreshing Listview oder Fragment im offen für Vorschläge

EDIT:

Mein letzter Adapter, die ziemlich gut funktioniert, wenn jemand weitere Vorschläge hat zu Machen Sie es noch besser machen Sie bitte einen Kommentar

using Android.Support.V4.App; 
using Android.Util; 
using Java.Lang; 

using Fragment = Android.Support.V4.App.Fragment; 

namespace StaffPro 
{ 
    public class TabsFragmentPagerAdapter : FragmentStatePagerAdapter 
    { 
     private readonly Fragment[] fragments; 

     private readonly ICharSequence[] titles; 

     SparseArray<Fragment> registeredFragments = new SparseArray<Fragment>(); 

     public TabsFragmentPagerAdapter(FragmentManager fm, Fragment[] fragments, ICharSequence[] titles) : base(fm) 
     { 
      this.fragments = fragments; 
      this.titles = titles; 
     } 
     public override int Count 
     { 
      get 
      { 
       return fragments.Length; 
      } 
     } 

     public override Fragment GetItem(int position) 
     { 
      return fragments[position]; 
     } 

     public override ICharSequence GetPageTitleFormatted(int position) 
     { 
      return titles[position]; 
     } 
     public override void DestroyItem(Android.Views.View container, int position, Java.Lang.Object objectValue) 
     { 

      registeredFragments.Remove(position); 
      base.DestroyItem(container, position, objectValue); 
     } 
     public override Java.Lang.Object InstantiateItem(Android.Views.ViewGroup container, int position) 
     { 
      Fragment fragment = (Fragment)base.InstantiateItem(container, position); 
      registeredFragments.Put(position, fragment); 
      return fragment; 
     } 
     public Fragment GetRegisteredFragment(int position) 
     { 
      return registeredFragments.Get(position); 
     } 
    } 
} 

Antwort

1

Sie könnten eine Aktualisierung aufrufen direkt innerhalb dieses Fragments von der übergeordneten Aktivität.

Sie benötigen auf Ihrem ViewPager Adapter einen Weg zur Rückführung des Fragments, so etwas wie dies umzusetzen: in Ihrer Haupttätigkeit

public override void DestroyItem(View container, int position, Object @object) 
    { 
     registeredFragments.Remove(position); 
     base.DestroyItem(container, position, @object); 
    } 

    public override Object InstantiateItem(ViewGroup container, int position) 
    { 
     Android.Support.V4.App.Fragment fragment = (Android.Support.V4.App.Fragment)base.InstantiateItem(container, position); 
     registeredFragments.Put(position, fragment); 
     return fragment; 
    } 

    public Android.Support.V4.App.Fragment GetRegisteredFragment(int position) 
    { 
     return registeredFragments.Get(position); 
    } 

Dann:

public void UpdateFragment() 
    { 
     var activeFragment = _Adaptor.GetRegisteredFragment(1); // where in the viewpager the fragment is 
     ((YourFragment)activeFragment).MethodOnFragment(); 
    } 
+0

Danke für die Antwort, Ich werde es so schnell wie möglich versuchen, auf dem getregisteredfragment, was ist die Position? die anfängliche Position, dass Viewpager die Fragmente geladen hat (in der Zeile der Tabs zum Beispiel, 1 Fragment 1 Tab, 2 Fragment 2 Registerkarte usw.) oder seine Position der zwischengespeicherten Fragmente? – CDrosos

+0

@CDrosos Das registrierte Fragment sollte also vom Typ SparseArray sein (SparseArray registeredFragments = neues SparseArray ();) Die Position befindet sich im viewpager das Fragment ist registriert. Das InstantiateItem Fügt die Fragmentposition in dieses Array ein, wenn es instanziiert ist. Wenn du also einen Viewpager mit 4 Seiten hast und du auf Seite 0 bist und das Fragment auf Seite 4 steht, ist die Position 3 – jaymarvels

+0

Hallo nochmal, hast du in Gedanken eine Möglichkeit für das Fragment einen drehenden Fortschrittsbalken währenddessen anzuzeigen sein Laden, wenn wir einen Tab wechseln? Wie in Facebook Messenger, danke – CDrosos