構文が間違っているか、ローダーの仕組みをまだ理解していませんが、現在、データベース内のすべてのアイテムを表示する ListView を取得しています。アクティビティには、今日の日付が表示されたボタンがあります。ユーザーはこれをクリックして日付ダイアログを表示するか、前/次ボタンを押して表示される日付を変更できます。表示されている日付に基づいて ListView をフィルター処理したいので、その日付が保存されているレコードのみが表示されます。
現在、すべてのレコードは
public Loader<Cursor> onCreateLoader(int id, Bundle args) {
CursorLoader cl = new CursorLoader(this, DBProvider.CONTENT_URI,
null, null, null, null);
return cl;
}
オンラインで見たものに基づいていくつかのバリエーションを試しましたが、基本的には、今日の日付を文字列として表示する「選択」を含めようとしています (すでに SimpleDateFormatter を使用してボタンのテキストとして設定されています)。
public Loader<Cursor> onCreateLoader(int id, Bundle args) {
String[] selectDate = { btn_logbook_date.getText().toString() };
CursorLoader cl = new CursorLoader(this, DBProvider.CONTENT_URI,
null, "Date=?", selectDate , null);
return cl;
}
と
public Loader<Cursor> onCreateLoader(int id, Bundle args) {
String selectDate = btn_logbook_date.getText().toString();
String selection = "(" + AddDBHelper.KEY_DATE + "=" + selectDate + ")";
CursorLoader cl = new CursorLoader(this, DBProvider.CONTENT_URI,
null, selection, null, null);
return cl;
}
どちらも NullPointerExceptions を生成します。ローダーの作成時にこれをフィルタリングする正しい方法に関するポインタをいただければ幸いです。
アップデート
fillData()
メソッドを呼び出す前にメソッド (ListView の入力に使用) を呼び出していたため、NullPointerException が発生していたようbtn_logbook_date.setText()
です。これをアクティビティのさらに下に移動したところonCreate
、アプリケーションはクラッシュしなくなりましたが、データが読み込まれなくなりました。今日の日付で新しいレコードを保存するとリストビューに表示されますが、日を変更すると他のレコードが表示されないことに気付きました。ListView アクティビティで今日に戻ると、空白も表示されます。
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView (R.layout.dash_logbook);
this.getListView().setDividerHeight(2);
ListView list = getListView();
list.setOnItemClickListener(this);
btn_logbook_date = (Button) findViewById(R.id.btn_logbook_date);
now = Calendar.getInstance();
nowD = now.getTime();
SimpleDateFormat dFormatter = new SimpleDateFormat("dd MMM yyyy");
strDate = dFormatter.format(nowD);
btn_logbook_date.setText(strDate);
fillData();
}
// I have code here to call on the DateDialogFragment
public void updateDatePrev() {
String prevVar[] = btn_logbook_date.getText().toString().split(" ");
if (prevVar[1].equalsIgnoreCase("Jan")) {
lMonth = 0;
} else if (prevVar[1].equalsIgnoreCase("Feb")) {
lMonth = 1;
} else if (prevVar[1].equalsIgnoreCase("Mar")) {
lMonth = 2;
} else if (prevVar[1].equalsIgnoreCase("Apr")) {
lMonth = 3;
} else if (prevVar[1].equalsIgnoreCase("May")) {
lMonth = 4;
} else if (prevVar[1].equalsIgnoreCase("Jun")) {
lMonth = 5;
} else if (prevVar[1].equalsIgnoreCase("Jul")) {
lMonth = 6;
} else if (prevVar[1].equalsIgnoreCase("Aug")) {
lMonth = 7;
} else if (prevVar[1].equalsIgnoreCase("Sep")) {
lMonth = 8;
} else if (prevVar[1].equalsIgnoreCase("Oct")) {
lMonth = 9;
} else if (prevVar[1].equalsIgnoreCase("Nov")) {
lMonth = 10;
} else if (prevVar[1].equalsIgnoreCase("Dec")) {
lMonth = 11;
}
int lYear = Integer.parseInt(prevVar[2]);
int lDay = Integer.parseInt(prevVar[0]);
now = Calendar.getInstance();
now.set(Calendar.YEAR, lYear);
now.set(Calendar.MONTH, lMonth);
now.set(Calendar.DAY_OF_MONTH, lDay - 1);
PrevDate = now.getTime();
SimpleDateFormat prevDFormatter = new SimpleDateFormat("dd MMM yyyy");
strDate = prevDFormatter.format(PrevDate);
btn_logbook_date.setText(strDate);
}
public void updateDateNext() {
//same code as above, except adding +1 to the days when clicked
}
private void fillData() {
// Fields from the database (projection) must include
// the _id column for the adapter to work
String[] from = new String[] { AddDBHelper.KEY_BGL, AddDBHelper.KEY_ROWID,
AddDBHelper.KEY_CATEG, AddDBHelper.KEY_TIME };
// Fields on the UI to which we map
int[] to = new int[] {R.id.logBGL, R.id.logRowID, R.id.logCateg, R.id.logTime };
getLoaderManager().initLoader(0, null, this);
adapter = new SimpleCursorAdapter(this, R.layout.logbook_item, null, from, to, 0);
setListAdapter(adapter);
}
public Loader<Cursor> onCreateLoader(int id, Bundle args) {
String selection = AddDBHelper.KEY_DATE + "=?";
String[] selectionArgs = { String.valueOf(btn_logbook_date.getText().toString()) };
CursorLoader cl = new CursorLoader(this, DBProvider.CONTENT_URI,
null, selection, selectionArgs, null);
return cl;
}
public void onLoadFinished(Loader<Cursor> loader, Cursor data) {
adapter.swapCursor(data);
}
public void onLoaderReset(Loader<Cursor> loader) {
adapter.swapCursor(null);
}
もともと別のアクティビティからデータベースに保存するときも、SimpleDateFormat
メソッドを使用して上記と同じ形式に変換しているため、保存された文字列とボタンに表示されているテキストは一致するはずです。
アップデート
以下でこの質問に答えました。元の質問は日付によるリストのフィルタリングに関するものであったため、リストの再作成に関する問題は個別に尋ねられます。今日の日付で新しいレコードを作成し、リストビュー アクティビティを開くときにデータを入力することで、これが機能していることを確認しました。Android エミュレーターで日付を変更し、アプリケーションとリストビュー アクティビティを再度開くと、新しく設定された日付に属するレコードを確認できました。