我遇到的主要问题是,当我尝试用一组全新的数据更新我的PagerAdapter时,我得到了一个FC。更具体地说,只有当我从PagerAdapter的数据集中删除某些内容时,我才能获得FC。ViewPager试图从坏的数据中重新创建一个片段
在我的主要活动我有这样的装载机回调:
@Override
public void onLoadFinished(Loader<Cursor> loader, Cursor newCursor) {
List<CycleItem> cycleItems = CursorInflator.inflateList(newCursor, CycleItem.class);
mCycleAdapter.setCycleList(cycleItems);
mIndicator.notifyDataSetChanged();
}
这里是我的CycleViewPagerAdapter(mCycleAdapter是一个参照本):
public class CycleViewPagerAdapter extends FragmentPagerAdapter implements TitleProvider {
private ArrayList<CycleItem> mCycleItems;
private CyclePagerCallbacks mParent;
public CycleViewPagerAdapter(CyclePagerCallbacks parent, FragmentManager fm) {
super(fm);
mParent = parent;
mCycleItems = new ArrayList<CycleItem>();
}
public CycleViewPagerAdapter(FragmentManager fm, List<CycleItem> cycleItems) {
super(fm);
mCycleItems = (ArrayList<CycleItem>) cycleItems;
}
public void setCycleList(List<CycleItem> cycleItems) {
mCycleItems = (ArrayList<CycleItem>) cycleItems;
notifyDataSetChanged();
}
@Override
public Fragment getItem(int position) {
return CycleDetailFragment.newInstance(mParent, mCycleItems.get(position % mCycleItems.size()).getId());
}
public String getTitle(int position) {
return mCycleItems.get(position % mCycleItems.size()).getName();
}
@Override
public int getCount() {
if (mCycleItems != null) {
return mCycleItems.size();
} else {
return 0;
}
}
@Override
public int getItemPosition(Object object) {
return POSITION_NONE;
}
}
这CycleViewPagerAdapter创建并返回CycleDetailFragments时为getItem方法被调用。这里是该类:
public class CycleDetailFragment extends Fragment implements PaginatedFragmentProtocol {
public interface CyclePagerCallbacks {
public void removeCycle(Uri cycleUri);
}
private static final String TAG = "CycleDetailFragment";
private CyclePagerCallbacks mParent;
private long mCycleId;
private Cycle cycle;
private static final String CYCLE_ID_KEY = "cycle_id";
private TextView mCycleName;
private TextView mNumItem;
private Button mDeleteCycle;
public static CycleDetailFragment newInstance(CyclePagerCallbacks parent, long cycleId) {
CycleDetailFragment cycleDetailFragment = new CycleDetailFragment(parent);
Bundle bundle = new Bundle();
bundle.putLong(CYCLE_ID_KEY, cycleId);
cycleDetailFragment.setArguments(bundle);
return cycleDetailFragment;
}
public CycleDetailFragment(CyclePagerCallbacks parent) {
mParent = parent;
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Bundle arguments = getArguments();
if (arguments != null) {
mCycleId = arguments.getLong(CYCLE_ID_KEY);
} else {
mCycleId = 0;
}
Log.i(TAG, Long.toString(mCycleId));
final Uri cycleUri = ContentUris.withAppendedId(CycleContentProvider.CONTENT_URI, mCycleId);
Cursor cursor = getActivity().getContentResolver().query(cycleUri, null, null, null, null);
final Cycle cycle = CursorInflator.inflateOne(cursor, Cycle.class);
Uri cycleItemsUri = ContentUris.withAppendedId(CycleItemContentProvider.CYCLE_ID_FIELD_CONTENT_URI, mCycleId);
Cursor cycleItemsCursor = getActivity().getContentResolver().query(cycleItemsUri, null, null, null, null);
mCycleName.setText(cycle.getName() + " " + cycle.getId());
mNumItem.setText(Integer.toString(cycleItemsCursor.getCount()));
mDeleteCycle.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
getActivity().getContentResolver().delete(cycleUri, null, null);
mParent.refresh();
}
});
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
Log.i("Creating View", "Cycle ID: " + mCycleId);
View view = inflater.inflate(R.layout.cycle_detail, container, false);
mCycleName = (TextView) view.findViewById(R.id.cycle_name);
mNumItem = (TextView) view.findViewById(R.id.num_items);
mDeleteCycle = (Button) view.findViewById(R.id.delete_cycle);
return view;
}
@Override
public String getFragmentTitle() {
return cycle.getName();
}
}
所以你看到CycleDetailFragment在数据库中寻找信息来填充视图。
这是我遇到的问题。在我从数据库中删除一个循环后,调用onLoadFinished方法,并用正确的项目填充cycleItems,但是一旦在删除后调用mCycleAdapter.setCycleList(cycleItems),我就会得到我的错误。 CycleDetailFragment中的onAcitivityCreated方法被调用(不是由我或我的PagerAdapter - 其他内部的东西),但它提供的数据应该不再存在!它传递的包含了我刚刚删除的项目的cycleId,并且不存在于刚创建的新拉出的cycleItems列表中。所以,它试图从数据库中取出不再存在的东西,并抛出空指针异常。
如何在不ViewPager首先尝试使用旧数据的情况下刷新我的PagerAdapter的数据集?