CursorAdapter 不想更新
CursorAdapter doesnt want to update
我从游标中删除了可能性,该功能有效,但 CursorAdapter 没有在 notifyDataSetChanged() 上更新,有人知道吗???目前查看更改的唯一方法是退出应用程序并再次 运行
public class DiaryFragment extends Fragment implements LoaderManager.LoaderCallbacks<Cursor>, AdapterView.OnItemClickListener {
private GridView mGridView;
private View mEmptyViews;
private TextView mAddNewDiaryEntry;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_diary, container, false);
setHasOptionsMenu(true);
getLoaderManager().initLoader(0, null, this);
mGridView = (GridView) view.findViewById(R.id.gridview);
mGridView.setAdapter(new DiaryAdapter(getActivity()));
mGridView.setOnItemClickListener(this);
return view;
}
@Override
public void onResume() {
super.onResume();
GALogEvent.logScreen(getActivity(), "Diary");
getLoaderManager().restartLoader(0, null, this);
}
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
super.onCreateOptionsMenu(menu, inflater);
getActivity().getMenuInflater().inflate(R.menu.diary, menu);
}
private CursorAdapter getAdapter() {
return ((CursorAdapter) mGridView.getAdapter());
}
public static Fragment newInstance() {
return new DiaryFragment();
}
@Override
public Loader<Cursor> onCreateLoader(int id, Bundle args) {
return new CursorLoader(getActivity(),ContentProvider. URI, null, null, null, ContentProvider.DIARY_DATE + " DESC");
}
@Override
public void onLoadFinished(Loader<Cursor> loader, Cursor data) {
getAdapter().swapCursor(data);
if (data != null && data.getCount() > 0) {
mGridView.setVisibility(View.VISIBLE);
mEmptyViews.setVisibility(View.GONE);
}
}
@Override
public void onLoaderReset(Loader<Cursor> loader) {
getAdapter().swapCursor(null);
}
@Override
public void onItemClick(AdapterView<?> parent, View view, final int position, long id) {
Cursor c = (Cursor) parent.getAdapter().getItem(position);
int diaryEntryId = c.getInt(c.getColumnIndex(ContentProvider.ID));
Intent intent = new Intent(getActivity(), AddDiaryEntryActivity.class);
boolean didSmoke = c.getInt(c.getColumnIndex(ContentProvider.DIARY_DID_SMOKE)) != 0;
intent.putExtra(Constants.DIARY_UPDATE_STATUS, didSmoke);
intent.putExtra(Constants.DIARY_ENTRY, diaryEntryId);
startActivity(intent);
}
private class DiaryAdapter extends CursorAdapter {
private final LayoutInflater mLayoutInflater;
public DiaryAdapter(Context context) {
super(context, null, true);
mLayoutInflater = LayoutInflater.from(context);
}
@Override
public View newView(Context context, Cursor cursor, ViewGroup parent) {
return mLayoutInflater.inflate(R.layout.row_diary, parent, false);
}
@Override
public void bindView(View view, Context context, final Cursor cursor) {
final int idCraving = cursor.getInt(cursor.getColumnIndex(ContentProvider.ID));
final ImageView deleteDiaryEntry;
deleteDiaryEntry = (ImageView) view.findViewById(R.id.remove_registry_from_diary);
deleteDiaryEntry.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
getActivity().getContentResolver().delete(ContentProvider. URI, " _id = ? ", new String[]{"" + idCraving});
getAdapter().notifyDataSetChanged();
}
});
}
}
}
在您的 ContentProvider 的 delete() 方法中,您需要有以下代码行:
getContext().getContentResolver().notifyChange(uri, null);
根据官方文档,此行将通知 CursorAdapter 对象发生了更改。如果您没有此行,则只有当代码重新查找数据库时才会看到更改,这发生在您退出并重新打开应用程序时。
我从游标中删除了可能性,该功能有效,但 CursorAdapter 没有在 notifyDataSetChanged() 上更新,有人知道吗???目前查看更改的唯一方法是退出应用程序并再次 运行
public class DiaryFragment extends Fragment implements LoaderManager.LoaderCallbacks<Cursor>, AdapterView.OnItemClickListener {
private GridView mGridView;
private View mEmptyViews;
private TextView mAddNewDiaryEntry;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_diary, container, false);
setHasOptionsMenu(true);
getLoaderManager().initLoader(0, null, this);
mGridView = (GridView) view.findViewById(R.id.gridview);
mGridView.setAdapter(new DiaryAdapter(getActivity()));
mGridView.setOnItemClickListener(this);
return view;
}
@Override
public void onResume() {
super.onResume();
GALogEvent.logScreen(getActivity(), "Diary");
getLoaderManager().restartLoader(0, null, this);
}
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
super.onCreateOptionsMenu(menu, inflater);
getActivity().getMenuInflater().inflate(R.menu.diary, menu);
}
private CursorAdapter getAdapter() {
return ((CursorAdapter) mGridView.getAdapter());
}
public static Fragment newInstance() {
return new DiaryFragment();
}
@Override
public Loader<Cursor> onCreateLoader(int id, Bundle args) {
return new CursorLoader(getActivity(),ContentProvider. URI, null, null, null, ContentProvider.DIARY_DATE + " DESC");
}
@Override
public void onLoadFinished(Loader<Cursor> loader, Cursor data) {
getAdapter().swapCursor(data);
if (data != null && data.getCount() > 0) {
mGridView.setVisibility(View.VISIBLE);
mEmptyViews.setVisibility(View.GONE);
}
}
@Override
public void onLoaderReset(Loader<Cursor> loader) {
getAdapter().swapCursor(null);
}
@Override
public void onItemClick(AdapterView<?> parent, View view, final int position, long id) {
Cursor c = (Cursor) parent.getAdapter().getItem(position);
int diaryEntryId = c.getInt(c.getColumnIndex(ContentProvider.ID));
Intent intent = new Intent(getActivity(), AddDiaryEntryActivity.class);
boolean didSmoke = c.getInt(c.getColumnIndex(ContentProvider.DIARY_DID_SMOKE)) != 0;
intent.putExtra(Constants.DIARY_UPDATE_STATUS, didSmoke);
intent.putExtra(Constants.DIARY_ENTRY, diaryEntryId);
startActivity(intent);
}
private class DiaryAdapter extends CursorAdapter {
private final LayoutInflater mLayoutInflater;
public DiaryAdapter(Context context) {
super(context, null, true);
mLayoutInflater = LayoutInflater.from(context);
}
@Override
public View newView(Context context, Cursor cursor, ViewGroup parent) {
return mLayoutInflater.inflate(R.layout.row_diary, parent, false);
}
@Override
public void bindView(View view, Context context, final Cursor cursor) {
final int idCraving = cursor.getInt(cursor.getColumnIndex(ContentProvider.ID));
final ImageView deleteDiaryEntry;
deleteDiaryEntry = (ImageView) view.findViewById(R.id.remove_registry_from_diary);
deleteDiaryEntry.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
getActivity().getContentResolver().delete(ContentProvider. URI, " _id = ? ", new String[]{"" + idCraving});
getAdapter().notifyDataSetChanged();
}
});
}
}
}
在您的 ContentProvider 的 delete() 方法中,您需要有以下代码行:
getContext().getContentResolver().notifyChange(uri, null);
根据官方文档,此行将通知 CursorAdapter 对象发生了更改。如果您没有此行,则只有当代码重新查找数据库时才会看到更改,这发生在您退出并重新打开应用程序时。