使用视图寻呼机重新加载片段中选定的选项卡上的数据

时间:2016-09-15 20:32:51

标签: c# android android-fragments xamarin

我在视图页面中有我的片段,但我想在所选的标签页面上重新加载数据。我尝试在我的PositionNone中的GetItemPosition方法中返回FragmentPagerAdapter,但它没有工作

我尝试在选中的标签上添加notifyDataSetChanged();,但它会抛出nullpointer异常。 我甚至试过设置viewPager.setOffscreenPageLimit 我设法找到了链接: Replace Fragment inside a ViewPager 但它是在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();
        }
    }

这是我的Actvity

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

   }
}

1 个答案:

答案 0 :(得分:6)

我设法自己解决了。 在我的活动中,我在Pageselected事件

上调用了NotifyDataSetChanged()

<强>活动

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

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

<强>适配器

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

我确定有更好的方法可以做到这一点但是这样做。