【问题标题】:How to set different data onto a fragment/viewpager如何将不同的数据设置到片段/viewpager
【发布时间】:2014-12-23 07:38:55
【问题描述】:

我环顾四周,但找不到任何解决方案,所以这是我最后的选择。

我正在开发一个 Xamarin-Android 项目,并且我有一个带有一个片段的 viewpager。这个片段的技巧是,即使它只是一个片段,它也会加载这个片段的许多实例,具体取决于我需要多少,但问题是每个片段都需要加载一个对象(一组数据)。我遇到的问题是,当我遍历返回的项目列表(从文件加载)时,它显然会遍历所有内容并将最后一组返回的数据设置到我的片段上。这导致我有许多具有相同数据的片段。我需要将一组数据加载到每个片段上,而不是将最后一组数据加载到我的片段上。所以本质上,我有一个片段,它加载了许多实例,每个实例都需要显示一个对象的数据。我该怎么做?

提前感谢您的帮助。

好的,请看下面 - 这是片段类。我省略了片段的 OnCreateView,因为它只会膨胀片段资源并获取文本视图等。如果您还需要 FragmentPagerAdapter 代码,请告诉我。这个片段有很多实例,这些实例是在 FragmentPagerAdapter 类中的 Count 和 GetItem 重写方法中设置的。 Count 返回所需的实例数,GetItem 会返回“返回 ThisFragment.newInstance(position);”

编辑:使用解决方案更新代码

private int mNum;
private string code, status;
TextView textviewMyObjectCode, textviewMyObjectStatus;

public static ThisFragment newInstance(int num)
{
    ThisFragment myFragment = new ThisFragment();
    MyObject myObject = new MyObject();

    List<MyObject> myObjectList = MyObjectIO.LoadMyObjectsFromFile();

    myObject.MyObjectNumber = myObjectList[num].MyObjectNumber;
    myObject.MyObjectStatus = myObjectList[num].MyObjectStatus;

    args.PutInt("num", num);
    args.PutString("objectCode", myObject.MyObjectNumber);
    args.PutString("objectStatus", myObject.MyObjectStatus);

    myFragment.Arguments = args;

    return thisFragment;
}

public override void OnCreate(Bundle savedInstanceState)
{
    base.OnCreate(savedInstanceState);
    mNum = Arguments != null ? Arguments.GetInt("num") : 1;
    code = Arguments.GetString("objectCode");
    status = Arguments.GetString("objectStatus");          
}

    public override View OnCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
    {
       if (container == null)
       {
         return null;
       }

       View thisView = inflater.Inflate(Resource.Layout.object_fragment, container, false);

       textviewObjectStatus = thisView.FindViewById<TextView>(Resource.Id.textviewObjectStatus);
       textviewObjectCode = thisView.FindViewById<TextView>(Resource.Id.textviewObjectCode);

       textviewObjectCode.Text = code;
       textviewObjectStatus.Text = status;

       return thisView;
   }

【问题讨论】:

  • 您需要发布代码,否则很难提出解决方案。
  • 感谢您的快速回复。您需要整个项目的代码还是只需要从文件中获取数据并将其加载到片段上的 sn-p?
  • 不是整个项目..只是处理片段的代码的sn-p。
  • 好的,谢谢。我试图在这里发布我的代码,但它抱怨它太长了。请稍等。
  • 你能把代码贴在你的主要问题中,以便你可以正确格式化它吗?

标签: android xamarin android-viewpager fragment fragmentpageradapter


【解决方案1】:

“FragmentPagerAdapter”应该负责创建新的 Fragment。您似乎已将此责任委托给 Fragment 类,这不是正确的方法。在这里,您将在循环中一次又一次地设置“textviewMyObjectCode”和“textviewMyObjectStatus”的文本,因此这些值将在循环的每次迭代中被覆盖。 理想情况下,您应该访问“newInstance”中的“MyObjectList”,并根据“num”中传递的索引设置 Bundle 对象中的值。此外,“newInstance”应该是“FragmentPagerAdapter”的一部分,“MyObjectList”应该对“FragmentPagerAdapter”可用。

如果“ThisFragment”是需要成为 ViewPager 一部分的 Fragment,那么该 Fragment 应该只是完成从 Bundle 中检索其数据并将所需数据设置为其资源的工作。

【讨论】:

  • 非常感谢 :) 明天看看,看看我需要做什么。
  • 我对此仍有一些问题。任何人都可以分享一些可以帮助我的代码吗? (对不起,我是菜鸟)
【解决方案2】:

我设法弄明白了。由于我使用的是 newInstance 方法,该方法包含一个名为“num”的位置变量,并且因为我从 LoadObjectsFromFile 方法中获得了对象列表,所以我可以将特定对象分配给特定片段。示例:我可以将对象 [0] 加载到片段 [0] 上。我在 newInstance 方法中执行此操作,将值设置为 Bundle,然后稍后在 OnCreate 中检索它。然后在 OnCreateView 中,我可以将值放到我的文本视图中。 @Jay,我现在明白你一直在说什么。它最初没有点击:)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-04-24
    • 1970-01-01
    • 1970-01-01
    • 2019-07-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多