在Bundle中存储ArrayList <object>以供片段

时间:2015-08-13 16:35:00

标签: java android android-fragments arraylist android-bundle

我的应用程序有一个包含三个片段的视图寻呼机。这些由FragmentPagerAdapter管理。

protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // Fragment page adapter
        mainFragmentPagerAdapter = new MainFragmentPagerAdapter(getSupportFragmentManager());

        // Set the view pagers adapter
        ViewPager viewPager = (ViewPager) findViewById(R.id.viewpager);
        viewPager.setAdapter(mainFragmentPagerAdapter);

        // Set up the TabLayout using the view pager
        TabLayout tabLayout = (TabLayout) findViewById(R.id.fixed_tabs);
        tabLayout.setupWithViewPager(viewPager);
}

当所有这些片段都包含可以更新的RecyclerView时,事情开始变得复杂。

为了正确地将数据传递给Fragments,我使用下面显示的newInstance方法:

public static InformationFragment newInstance() {
        Bundle arguments = new Bundle();
        // Put arguments here.
        InformationFragment fragment = new InformationFragment();
        fragment.setArguments(arguments);
        return fragment;
}

然后我在InformationFragment中有另一个方法来在需要时更新参数:

public void updateData() {

    Bundle arguments = getArguments();
    // Put arguments
    this.adapter.updateItems(items);
}

可用于填充RecyclerView的数据需要具有多种类型(某些Android,某些自定义)。因此,我ArrayList<Object> items;包含了我的所有对象。

我的问题是,将这个ArrayList存储在一个bundle中的最佳方法是什么,它可以被一个片段使用?

我能够做到以下几点,但感觉很脏:

public void updateData(ArrayList<Object> items) {
        getArguments().putSerializable("items", items);
        this.adapter.updateItems(items);
    }

然后通过以下方式检索:

if (arguments.containsKey("items")) {
            ArrayList<Object> items = (ArrayList<Object>)arguments.getSerializable("items");
}

或者有更好的方法吗?

1 个答案:

答案 0 :(得分:0)

我建议不要保留List<Object>,而是将多个列表放入捆绑包中。另外,将对象作为可序列化的对象放入捆绑包中并不是那么糟糕,但如果你想这样做,那么你就可以为这个捆绑包中存储的每个对象实现Parcelable接口。