如何在ViewPager Xamarin中重新加载片段

时间:2017-01-14 12:25:12

标签: android android-fragments android-viewpager xamarin.android

我在数据库端有大量数据,我正在使用50行的服务检索数据并将这些数据放入ViewPager片段中。它工作正常,但是一旦用户到达第50页,我需要重新调用服务,并且需要使用新数据更新片段。目前,我正在调用Android.Support.V4.App.Fragment的覆盖newInstance(字符串消息)方法中的服务。

有没有办法在Xamarin Anadroid中动态更新带有新数据的片段?

2 个答案:

答案 0 :(得分:2)

我有同样的问题。我将FragmentPagerAdapter更改为FragmentStatePagerAdapter

时解决了此问题

仅在第一次显示

class ViewPagerPageAdapter : FragmentPagerAdapter

还显示何时重新加载片段

class ViewPagerStatePagerAdapter : FragmentStatePagerAdapter

答案 1 :(得分:0)

更新特定的viewpager片段。我认为您不需要重新创建活动或重新创建片段。

尝试使用adapter.NotifyDataSetChanged()更新片段。

按照setps更新sepcific viewpager片段:

<强> 1。创建处理程序

    class MyHandler : Handler
        {
            public override void HandleMessage(Message msg)
            {
                if (msg.What == 1)
                {
                    mainAdapter.NotifyDataSetChanged();
                }
            }
        }

<强> 2。到达第50个片段时发送消息

    class PageChangeListen : Java.Lang.Object, IOnPageChangeListener
        {
            public void OnPageScrolled(int position, float positionOffset, int positionOffsetPixels)
            {

            }

            public void OnPageScrollStateChanged(int state)
            {

            }

            public void OnPageSelected(int position)
            {
                if (position == 1)
                {
                    Message msg = new Message();
                    msg.What = 1;
                    new MyHandler().SendMessage(msg);
                }
            }
        }

第3。在主线程中,您将收到该消息并致电NotifyDataSetChanged

<强> 4。添加片段的更新界面

    public interface Updateable
    {
         void update();
    }


    public class MyFragment : Android.Support.V4.App.Fragment, Updateable
    {

        TextView questionBox;
        public MyFragment() { }

        public static MyFragment NewInstance(String question)
        {
            MyFragment fragment = new MyFragment();
            return fragment;
        }
        public override View OnCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
        {
            View view = inflater.Inflate(Resource.Layout.MyFragmentLayout, container, false);
            questionBox = (TextView)view.FindViewById(Resource.Id.textView1);
            return view;
        }

        public void update()
        {
            questionBox.Text = "Mike Update";
        }
  }

<强> 5。片段将通过调用GetItemPosition更新用户界面。

     public override int GetItemPosition(Object @object)
            {
                MyFragment f = (MyFragment)@object;
                System.Console.WriteLine(f.Id + "" + f.Resources + "" + f.Tag);
                if (f != null)
                {
                    f.update();
                }
                return base.GetItemPosition(@object);
            }

在我的示例中,我使用文本&#34; Mike Update&#34;更新了第二页。您可以更改更新条件和内容。

屏幕截图:

enter image description here

git source code is here