2016-10-02 67 views
0

進出口使用標籤佈局不可見的緩存片段刷新殘片ViewPager /標籤實現(與ViewPager,它的適配器是FragmentStatePagerAdapterTabLayout的擴展)和IM嘗試當我點擊tab1上的一個按鈕時刷新tab2上的listview。 我從現在持有viewpager的活動中完成這項工作,因爲我不知道任何其他方式來做這件事。 我刷新它的方法是:重新加載/與自定義適配器

  1. 監視器OnTabSelected ViewPager
  2. 當TAB2變得可見,刷新的ListView像這樣的東西:

    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(); 
    

正如你可能從代碼中可以理解,我的問題是ListView不會替換它的項目,它只會將它們添加到其他項目的頂部,我如何清除listview?

我也試過沒有運氣.RemoveViews(0,test.ChildCount); 我的listview適配器是BaseAdapter的簡單擴展。

此外,如果有清爽的ListView片段的另一種更好的方式 IM開放的建議

編輯:

我的作品非常好,如果任何人有更多的建議,最終適配器使其更好請發表評論

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); 
     } 
    } 
} 

回答

1

你可以調用刷新直接在父活動的片段中。

你需要在你的ViewPager適配器返回的片段來實現的一種方式,所以是這樣的:

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); 
    } 

然後在您的主要活動:

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

感謝您的回答,我會盡快嘗試,在getregisteredfragment上的位置是什麼? viewpager加載片段的初始位置(在標籤的行中,例如1片段1tab,2片段2標籤等)或其緩存片段的位置? – CDrosos

+0

@CDrosos所以註冊片段應該是類型SparseArray的(SparseArray registeredFragments =新SparseArray ())的位置是在viewpager該片段已被註冊。 InstantiateItem在其實例化時將碎片位置放入此數組中。所以,如果你有一個Viewpager用4頁和你是第0頁上的片段是第4頁上的位置是3 – jaymarvels

+0

大家好,你在你的腦海中顯示一個旋轉的進度條,而該片段有辦法它的加載,當我們改變一個標籤?像在Facebook的使者一樣,謝謝 – CDrosos