我正在使用标签布局( ViewPager,它的适配器是 FragmentStatePagerAdapter 和 TabLayout 的扩展名),我试图刷新列表视图tab2当我点击tab1上的按钮时。 我现在正从持有viewpager的活动做这项工作,因为我不知道其他任何方式。 我刷新它的方式是:
当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();
正如您可能从代码中理解的那样,我的问题是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);
}
}
}
答案 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();
}