使用ViewPager Bundle或Getters初始化和更新片段的数据

时间:2016-01-14 20:57:52

标签: android android-fragments

我在掌握使用ViewPager创建片段的正确方法时遇到了一些困难,初始化了他们的数据,然后最终更新了他们的数据。

挑战在于我在哪里坚持数据结构?目前它作为一个包从上一个活动传入我的主要活动并像这样初始化(其中mTitles是我的标题标题和片段标题的列表,mData是包含每个片段的数据列表的散列映射

HashMap<String, ArrayList<Parcelable>> mData = new HashMap<String, ArrayList<Parcelable>>();
ArrayList<String> mTitles = new ArrayList<String>()

private void initializeData(Bundle extras, String[] keys) {
        for (int i = 0; i < keys.length; i++) {
            mData.put(keys[i], extras.getParcelableArrayList(keys[0]));
        }
        if (viewPager != null) {
            setupViewPager(viewPager, keys);
        }
    }

然后我调用setupViewPager从数据结构初始化片段及其数据。

public class FragmentObserver extends Observable {
    @Override
    public void notifyObservers() {
        setChanged(); // Set the changed flag to true, otherwise observers won't be notified.
        super.notifyObservers();
    }

    @Override
    public void notifyObservers(Object object) {
        setChanged(); // Set the changed flag to true, otherwise observers won't be notified.
        super.notifyObservers(object);
    }
}

private void setupViewPager(final ViewPager viewPager, String[] tabs) {
    Adapter adapter = new Adapter(getSupportFragmentManager());

    for (int i = 0; i < tabs.length; i++) {
        Bundle b1 = new Bundle();
        b1.putString("title", tabs[i]);
        Log.d("ADAPTER: ", "putting " + tabs[i]);
        b1.putParcelableArrayList(tabs[i], mData.get(tabs[i]));

        ListFragment f1 = new ListFragment();
        f1.setArguments(b1);

        mTitles.add(tabs[i]);
        adapter.addFragment(f1, tabs[i]);
    }
    viewPager.setAdapter(adapter);          
}
class Adapter extends FragmentPagerAdapter {
    private List<Fragment> mFragments = new ArrayList<>();
    private List<String> mFragmentTitles = new ArrayList<>();

    private Observable mObservers = new FragmentObserver();

    public Adapter(FragmentManager fm) {
        super(fm);
    }

    public void addFragment(Fragment fragment, String title) {
        this.mFragments.add(fragment);
        this.mFragmentTitles.add(title);
    }

    public Fragment getItemByTitle(String title) {
        int index = this.mFragmentTitles.indexOf(title);
        return (index > 0) ? getItem(index) : null;
    }

    @Override
    public Fragment getItem(int position) {
        Fragment f = this.mFragments.get(position);
        mObservers.addObserver((Observer) f);
        return f;
    }

    @Override
    public int getCount() {
        return this.mFragments.size();
    }

    @Override
    public CharSequence getPageTitle(int position) {
        return this.mFragmentTitles.get(position);
    }

    public void updateFragments(SessionInfo session) {
        mObservers.notifyObservers(session);

    }
}

片段代码:

ArrayList<Info> mDatas;
public ListFragment(){
        super();

}
@Override
public void update(Observable observable, Object data) {
    View root = getView();
    // Update your views here.
    Log.d("OBSERVER", "called update for: " + ((SessionInfo) data).getActivity());
    Log.d("OBSERVER", "I am " + title);

//        SimpleStringRecyclerViewAdapter a = ((SimpleStringRecyclerViewAdapter)rv.getAdapter());
//        a.insertValueAt(0, (SessionInfo) data);
//
//        a.notifyItemInserted(0);

}
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    rv = (RecyclerView) inflater.inflate(
            R.layout.fragment_session_list, container, false);

    String title = getArguments().getString("title");
    mDatas = getArguments().getParcelableArrayList(title);
//        SessionInfo first = sessions.get(0);
//        Log.i("FRAG", first.getActivity());
    this.title = title;


    return rv;
}

问题和我的问题是当我需要更新片段数据结构时会发生什么?目前它存储在Activity类中,所以我在那里更新它,然后调用observer update方法将数据传递给片段。但是如果我需要更新片段3并且我还没有将我的ViewPager滚动到3,那么我得到一个空指针错误,所以它没有被初始化,当然还没有Observer。如何更新片段数据?

这个观察者模式是否存在内存泄漏?

我是否应该持有对Activity的引用并为我的数据调用getter方法,而不是将其作为包发送?

1 个答案:

答案 0 :(得分:1)

您可以参考本教程:https://github.com/codepath/android_guides/wiki/ViewPager-with-FragmentPagerAdapter

基本上传递你的HashMap&gt; mData到Adapter和来自适配器setArguments()以及每个片段的相关数据。这样,相关数据就会与相关对象保持一致。