リストビューを分割する方法を理解することは、今私の尻を蹴っている. ここで sectioned-list-adapter のコードを見てきました: ListView with scrolling/fixed header rowsで、これが最終的には私が望むものかもしれませんが、おそらくもっと良い方法があります。
必要な要件は次のとおりです。
- リストビューのデータは、SQLite データベースから取得する必要があります (テーブル レイアウトについては、以下のコードを参照してください)。
- データは月ごとにグループ化する必要があります (月/年のボーナス ポイント)
- ヘッダー行には、その月にデータベースに記録されたアイテムの数が含まれている必要があります
- API 8+ と互換性がある必要があります
- アイテムをクリックして、その日に実行された移動を含むダイアログを開くことができる必要があります (リストが作成されたら、これを行う方法は既に知っています)
ここで Jeff Snarkey の seperatedListAdapter を見る: http://jsharkey.org/blog/2008/08/18/separating-lists-with-headers-in-android-09/ 私は次のことを思いつくことができました:
datasource = new SmashDataSource(this);
datasource.open();
BJJHistory = (ListView) findViewById(R.id.ListHistory);
// create our list and custom adapter
adapter = new SeparatedListAdapter(this);
HistoryBJJ = datasource.getBJJHistory();
// THE DESIRED COLUMNS TO BE BOUND
final String[] columns = new String[] { SQLiteHelper.DATE };
// THE XML DEFINED VIEWS WHICH THE DATA WILL BE BOUND TO
final int[] to = new int[] { R.id.list_item_title };
if (HistoryBJJ != null) {
adapter.addSection("October", new SimpleCursorAdapter(this, R.layout.list_item,
HistoryBJJ, columns, to));
}
BJJHistory.setAdapter(adapter);
これは、次のカーソルを使用して、SQLite データベースから降順でデータを取得します。
public Cursor getBJJHistory() {
final String[] columns = { SQLiteHelper.COLUMN_ID, SQLiteHelper.DATE };
final Cursor History;
History = database.query(SQLiteHelper.TABLE_BJJ, columns, null, null, null, null,
SQLiteHelper.DATE + " DESC");
return History;
}
これにより、次の結果が得られます。
これは最初は問題ありませんが、次の 2 つの問題があります。
- 「ヘッダー」値に月を動的に入力する方法は? カーソルを使用して配列に月のリストを入力し (SimpleDateFormat で書式設定した後)、For Each ループを実行してそれぞれを通過し、月をカーソル メソッドに戻してすべてのエントリをプルすることを考えました。その月の datetime 値を使用します。
- 結果をその日のエントリー数として連続して表示するには?理想的には、次のようなものが欲しいです:
#2の答えはやや単純です。リストビューの行レイアウトに2つのテキストビューを配置するだけです。より複雑なのは、データベース内のすべての行を毎日グループ化する方法、または少なくとも毎日カウントを行い、そのカウントを使用する方法です。リストに表示します。
最初に、ここのサンプル コードに戻ります: http://code.google.com/p/android-section-list/、提供されているサンプル配列の代わりに、次のように変更できると思います。
SectionListItem[] exampleArray = { // Comment to prevent re-format
new SectionListItem("Test 1 - A", "A"), //
new SectionListItem("Test 2 - A", "A"), //
new SectionListItem("Test 3 - A", "A"), //
new SectionListItem("Test 4 - A", "A"), //
new SectionListItem("Test 5 - A", "A"), //
new SectionListItem("Test 6 - B", "B"), //
new SectionListItem("Test 7 - B", "B"), //
new SectionListItem("Test 8 - B", "B"), //
new SectionListItem("Test 9 - Long", "Long section"), //
new SectionListItem("Test 10 - Long", "Long section"), //
new SectionListItem("Test 11 - Long", "Long section"), //
new SectionListItem("Test 12 - Long", "Long section"), //
new SectionListItem("Test 13 - Long", "Long section"), //
new SectionListItem("Test 14 - A again", "A"), //
new SectionListItem("Test 15 - A again", "A"), //
new SectionListItem("Test 16 - A again", "A"), //
new SectionListItem("Test 17 - B again", "B"), //
new SectionListItem("Test 18 - B again", "B"), //
new SectionListItem("Test 19 - B again", "B"), //
new SectionListItem("Test 20 - B again", "B"), //
new SectionListItem("Test 21 - B again", "B"), //
new SectionListItem("Test 22 - B again", "B"), //
new SectionListItem("Test 23 - C", "C"), //
new SectionListItem("Test 24 - C", "C"), //
new SectionListItem("Test 25 - C", "C"), //
new SectionListItem("Test 26 - C", "C"), //
それをカーソルまたは日ごとにデータをプルする必要のないものに置き換えてから、「A」、「B」、「C」の代わりに、それを月の名前に置き換えます。
私はまだ学習しているので、これはかなり混乱しています。このアプリのほぼすべての部分を完成させました。データをリストに分割する方法がわかりません。
参考までに、これは「CardioTrainer」のスクリーンショットです。これは、カスタム セクション リストを持つワークアウト アプリですが、少なくとも機能的には基本的に複製しようとしています。
これが由来するテーブルは次のようになります。