使用自定义适配器在不可见的缓存片段中重新加载/刷新ViewPager / Tab实现中的片段

时间:2016-10-02 21:21:19

标签: c# android listview xamarin android-viewpager

我正在使用标签布局( ViewPager,它的适配器是 FragmentStatePagerAdapter TabLayout 的扩展名),我试图刷新列表视图tab2当我点击tab1上的按钮时。 我现在正从持有viewpager的活动做这项工作,因为我不知道其他任何方式。 我刷新它的方式是:

  1. 监控ViewPager的 OnTabSelected
  2. 当tab2变为Visible时,请使用以下内容刷新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();
    
  3. 正如您可能从代码中理解的那样,我的问题是ListView没有替换它的项目,它只是将它们添加到其他项目中,我如何清除列表视图?

    我也试过没有运气 .RemoveViews(0,test.ChildCount); 我的listview适配器是BaseAdapter的简单扩展。

    此外,如果您有另一种更好的方式来刷新 ListView 片段,我会对建议开放

    修改

    我的最终适配器非常好用,如果有人有更多建议可以让它更好,请发表评论

    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 个答案:

答案 0 :(得分: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();
    }