2012-03-08 1 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(); 
} 

は(mCycleAdapterがこれへの参照です)私のCycleViewPagerAdapterです:

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; 
    } 

} 

ときのgetItemこのCycleViewPagerAdapterはCycleDetailFragmentsを作成して返します。メソッドが呼び出されます。ここでは、そのクラスは次のとおりです。

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を使用しないでください。