2016-10-02 39 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