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

本文关键字:片段 一个 适配器 缓存 自定义 Tab 加载 新加载 刷新 实现 ViewPager | 更新日期: 2023-09-27 18:11:23

我使用选项卡布局(与ViewPager,它的适配器是FragmentStatePagerAdapterTabLayout的扩展),我试图刷新tab2上的listview,当我点击tab1上的按钮。我做这个工作从活动持有viewpager现在,因为我不知道任何其他的方式来做它。我刷新它的方式是:

  1. Monitor OnTabSelected of 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的一个简单扩展。

如果你有另一种刷新ListViewFragment的更好方法,我愿意接受建议

编辑:

我最后的适配器工作得很好,如果有人有更多的建议,让它更好,请发表评论

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

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

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

你需要在你的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();
    }