如何将不同的数据设置到片段/ viewpager上

时间:2014-12-23 07:38:56

标签: android xamarin android-viewpager fragment fragmentpageradapter

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

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

提前感谢您的任何帮助。

好的,请看下面 - 这是片段类。我遗漏了片段的OnCreateView,因为它只会膨胀片段资源并获取textviews等。如果您需要FragmentPagerAdapter代码,请告诉我。这个片段有许多实例,它们在Count和GetItem覆盖方法的FragmentPagerAdapter类中设置。 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;
   }

2 个答案:

答案 0 :(得分:0)

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

如果'ThisFragment'是需要成为ViewPager一部分的片段,那么该片段应该只从Bundle中检索其数据并将所需数据设置为其资源。

答案 1 :(得分:0)

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