2012-03-08 63 views
1

我遇到的主要问题是,当我尝试用一​​组全新的数据更新我的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的数据集?

回答

0

你不应该在这里使用FragmentStatePagerAdapter?