【问题标题】:How to reload fragments in ViewPager Xamarin如何在 ViewPager Xamarin 中重新加载片段
【发布时间】:2017-01-14 12:25:12
【问题描述】:

我在数据库端有大量数据,我正在使用 50 行批次的服务检索数据,并将该数据放入 ViewPager 片段中。它工作正常,但是一旦用户到达第 50 页并需要使用新数据更新片段,我需要重新调用服务。目前,我在 Android.Support.V4.App.Fragment 的 override newInstance(string message) 方法中调用服务。

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

【问题讨论】:

  • public static MyFragment NewInstance(int playId) 这是 xamarin android 片段中的相同功能。
  • 迈克,你是对的。我使用这种方法来启动新的片段。但我正在寻找解决方案,如果我已经在视图寻呼机中有片段,当用户达到第 50 个片段时如何使用不同的参数调用它。
  • fragmentTransaction.Replace(Android.Resource.Id.Content, details); 在具有相同资源 ID 的片段事务中调用替换和提交函数。它将重新加载片段。
  • 是的,但是如何检测该用户位于视图寻呼机的第 50 页上,并且他正在尝试滑动新页面。如果我能够检测到这一点,那么我会调用任何方法来替换当前的片段。
  • viewPager.SetOnPageChangeListener 你可以检测你选择了哪个页面。在适配器中更新它。

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


【解决方案1】:

我遇到了同样的问题。我解决了这个问题,因为我将 FragmentPagerAdapter 更改为 FragmentStatePagerAdapter

只在第一次显示

class ViewPagerPageAdapter : FragmentPagerAdapter

当你重新加载片段时也会显示

class ViewPagerStatePagerAdapter : FragmentStatePagerAdapter

【讨论】:

    【解决方案2】:

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

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

    按照setps更新特定的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.添加fragment的更新接口

        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. fragment 将通过调用 GetItemPosition 来更新 UI。

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

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

    屏幕截图:

    git source code is here

    【讨论】:

    • 谢谢你,迈克,我正在找这个。很有帮助。
    • 嗨,迈克,它正在工作,我可以从服务中加载新数据。但是片段没有得到刷新。你能帮帮我吗?
    • 使用处理程序。更新片段时发送新消息
    • 迈克,我正在使用与您建议的方法相同的方法,并且它在简单的解决方案中工作。但在我的情况下它不起作用。我有一个带有内容框架的抽屉布局,我在选择抽屉项目时在此框架中加载片段。每个抽屉项目都有多个片段。
    • 那么当你点击drawer item时,不能更新fragment?
    猜你喜欢
    • 2018-07-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-23
    • 1970-01-01
    相关资源
    最近更新 更多