使用视图页重新加载片段中所选选项卡上的数据

本文关键字:选项 数据 片段 视图 新加载 加载 | 更新日期: 2023-09-27 18:07:20

我有我的片段内视图页面,但我想重新加载所选选项卡上的数据。我尝试在FragmentPagerAdapterGetItemPosition方法中返回PositionNone,但它不起作用。

我尝试在选项卡上添加notifyDataSetChanged();,但它会抛出空指针异常。我甚至尝试设置viewPager.setOffscreenPageLimit我设法找到了链接:在ViewPager中替换Fragment但它是在java上。我已经设法将大部分代码转换为c#,但在注释代码上卡住了。我不确定如何调用侦听器和实例化类在同一时间?有很多类似的问题,但不幸的是没有一个在Xamarin Android。

我需要在xamarin android中这样做。任何帮助都将不胜感激。

这是我的FragmentAdapter
public class TabsFragmentPagerAdapter : FragmentPagerAdapter
{
    private readonly Android.Support.V4.App.Fragment[] fragments;
    static readonly int NUM_ITEMS = 2;
    private readonly Android.Support.V4.App.FragmentManager FragmentManager;
    private Android.Support.V4.App.Fragment mFragmentAtPos0;
    private readonly ICharSequence[] titles;
    public TabsFragmentPagerAdapter(Android.Support.V4.App.FragmentManager fm, Android.Support.V4.App.Fragment[] fragments, ICharSequence[] titles) : base(fm)
    {
        this.fragments = fragments;
        this.titles = titles;
    }
    public override int Count
    {
        get
        {
            return fragments.Length;
        }
    }
    public override int GetItemPosition(Java.Lang.Object objectValue)
    {
        if (objectValue.GetType() == typeof(startJobFrag) && mFragmentAtPos0.GetType() == typeof(jobCaptureFrag))
        {
            return PositionNone;
        }
        return PositionUnchanged;
    }

    public override ICharSequence GetPageTitleFormatted(int position)
    {
        return titles[position];
    }

    public override Android.Support.V4.App.Fragment GetItem(int position)
    {
        if (position == 0)
        {
            if (mFragmentAtPos0 == null)
            {
                //not working
            }
            return mFragmentAtPos0;
        }
        else
        {
            return new jobCaptureFrag();
        }
    }

这是我的活动

 void FnInitTabLayout()
    {
        var fragments = new Android.Support.V4.App.Fragment[]
        {
new frag 1(),
new frag 2(),
new frag 3(),
        };
        //Tab title array
        var titles = CharSequence.ArrayFromStringArray(new[] {
    "Page 1",
    "Page 2",
     "Page 3",
   });
        var viewPager = FindViewById<ViewPager>(Resource.Id.viewpager);
        //viewpager holding fragment array and tab title text
        //viewPager.
        viewPager.Adapter = new TabsFragmentPagerAdapter(SupportFragmentManager, fragments, titles);
        // Give the TabLayout the ViewPager 
        tabLayout.SetupWithViewPager(viewPager);
        viewPager.PageSelected += (object sender, ViewPager.PageSelectedEventArgs e) =>
        {
            //FnInitTabLayout();
            if(e.Position == 0)
            {
              //handle tab click/selected
            }
        };
}
public interface FirstPageFragmentListener
{
    void onSwitchToNextFragment();
}

片段

public class Fragment1: Android.Support.V4.App.Fragment
{        
    public override void OnCreate(Bundle savedInstanceState)
    {
        base.OnCreate(savedInstanceState);
        // Create your fragment here
    }
    public override View OnCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
    {
        // Use this to return your custom view for this Fragment
        // return inflater.Inflate(Resource.Layout.YourFragment, container, false);
        View view = inflater.Inflate(Resource.Layout.myview, container, false);
   }
}

使用视图页重新加载片段中所选选项卡上的数据

我自己解决了这个问题。在我的活动中,我调用NotifyDataSetChanged()在Pageselected事件

  ViewPager.PageSelected += (object sender,                 ViewPager.PageSelectedEventArgs e) =>
        {
            if (e.Position == 1)
            {
                _pager.Adapter.NotifyDataSetChanged();
            }
        };

然后我将我的适配器从FragmentPagerAdapter更改为FragmentStatePagerAdapter并覆盖GetItemPosition

<<p> 适配器/strong>
    public class TabsFragmentPagerAdapter : FragmentStatePagerAdapter
    {
        public override int GetItemPosition(Java.Lang.Object objectValue)
        {
            return PositionNone;
        }
    }

在适配器

内刷新一个特定的选项卡
 public override Android.Support.V4.App.Fragment GetItem(int position)
    {
        if(position == 1) //second tab selected
        {
            NotifyDataSetChanged();
        }            
        return fragments[position];
    }

我相信有更好的方法,但这是可行的