我在掌握使用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方法,而不是将其作为包发送?
答案 0 :(得分:1)
您可以参考本教程:https://github.com/codepath/android_guides/wiki/ViewPager-with-FragmentPagerAdapter
基本上传递你的HashMap&gt; mData到Adapter和来自适配器setArguments()以及每个片段的相关数据。这样,相关数据就会与相关对象保持一致。