重新加载/刷新片段在ViewPager/Tab实现一个不可见的缓存片段与自定义适配器
本文关键字:片段 一个 适配器 缓存 自定义 Tab 加载 新加载 刷新 实现 ViewPager | 更新日期: 2023-09-27 18:11:23
我使用选项卡布局(与ViewPager,它的适配器是FragmentStatePagerAdapter和TabLayout的扩展),我试图刷新tab2上的listview,当我点击tab1上的按钮。我做这个工作从活动持有viewpager现在,因为我不知道任何其他的方式来做它。我刷新它的方式是:
- Monitor OnTabSelected of ViewPager
-
当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或Fragment的更好方法,我愿意接受建议
编辑:我最后的适配器工作得很好,如果有人有更多的建议,让它更好,请发表评论
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适配器上实现一种返回片段的方式,所以像这样:
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();
}