ListView
動的に追加されるアイテムがあります。アイテムが追加さListView
れると、リスト内のアイテムを保存できるように、SQLite データベースに追加され、挿入されます。アイテムの位置を取得し、その情報で削除することで、特定のアイテムを削除することもできます。
これは私がアイテムを追加する方法です(私は複数のクラスを使用しています):
でDataModel.class
:
public void addItem(Object data) {
String string = String.valueOf(data);
mPlanetsList.add(createPlanet("planet", string));
History history = new History();
history.getDataHashMap().put("planet", data);
history.addToHistoryDB();
mHistoryList.add(history);
if (null != mOnItemAddHandler) {
mOnItemAddHandler.onItemAdded(data);
}
}
.class History
:
public void addToHistoryDB() {
MySQLiteOpenHelper mDbHelper = MySQLiteOpenHelper.getInstance();
SQLiteDatabase db = mDbHelper.getWritableDatabase();
ContentValues values = getContentValues();
rawId = (int) db.insert(TABLE_NAME, COL_ID, values);
db.close();
}
これは私がアイテムを削除する方法です:
.class DataModel
:
public void removeItem(int index) {
if (mPlanetsList == null || index < 0 || index >= mPlanetsList.size()) {
return;
}
// remove from mPlanetList
mPlanetsList.remove(index);
History history = mHistoryList.get(index);
mHistoryList.remove(index);
if (null != history) {
history.remove();
history = null;
}
// notify, the HistoryFragment will update view
if (null != mOnItemAddHandler) {
mOnItemAddHandler.onItemRemove(index);
}
.class History
:
public void remove() {
MySQLiteOpenHelper mDbHelper = MySQLiteOpenHelper.getInstance();
SQLiteDatabase db = mDbHelper.getWritableDatabase();
int r = db.delete(TABLE_NAME, "_id = ?", // delete the int r ??
new String[] { String.valueOf(rawId) });
db.close();
}
アプリが「最近のアプリ」から削除されるか、再起動されると、initList()
が呼び出され、データベースから ListView アイテムが復元されます。
これはコードです:
DataModel
:
private void initList() {
mHistoryList = History.getList();
for (int i = 0; i < mHistoryList.size(); i++) {
Object obj = mHistoryList.get(i).getDataHashMap().get("planet");
mPlanetsList.add(createPlanet("planet", String.valueOf(obj)));
}
}
History
:
public static ArrayList<History> getList() {
Cursor cursor = null;
try {
MySQLiteOpenHelper mDbHelper = MySQLiteOpenHelper.getInstance();
SQLiteDatabase db = mDbHelper.getWritableDatabase();
String sql = "select * from " + History.TABLE_NAME;
ArrayList<History> list = new ArrayList<History>();
cursor = db.rawQuery(sql, null);
if (cursor != null) {
for (cursor.moveToFirst(); !cursor.isAfterLast(); cursor
.moveToNext()) {
History item = new History();
item.fromCuror(cursor);
list.add(item);
}
}
return list;
} finally {
if (null != cursor && Integer.parseInt(Build.VERSION.SDK) < 14) {
cursor.close();
}
}
}
リストの順序が変更されていない限り、この方法は正常に機能します。項目を追加したり削除したりでき、すべて完全に機能します。ただし、アイテムをリストの一番下ではなく一番上に追加したいと考えています。
そこで、ListView の一番上にアイテムを追加する方法を調べたところ、アイテムを追加するときに位置として 0 を追加すると、新しいアイテムがリストの一番上に表示されることがわかりました。
mPlanetsList.add(0, createPlanet("planet", string)); // I put the 0 in wherever the item is added eg when adding from the database
ただし、これを行うと、ListView で表示/削除されたアイテムは、データベース内のデータと引き続き対応しません。たとえば、リストに 3 つの項目を追加するとしdog
ます。ListView はそれらを正しい順序で表示します (一番上)。その後、アイテムを削除すると、次のようになります。 ListView が更新され、すべてが正常に機能します。しかし、アプリを再起動すると、呼び出されます。ここで問題が発生します。リストから削除されたのではなく、または.cat
horse
horse
cat
initList()
cat
horse
dog
問題があると思われるポイントは次のとおりです。
a) initList() - 正しい項目を追加していません
b) removeItem() - データベースから正しいアイテムを削除していません。
c) getList() で - 多分カーソルで何か???
これはb)の可能性が高いと思いますが、問題が正確にどこにあるのか、何を変更すればよいのかわかりません。
編集:
少しテストした後、b) がうまくいかないところが正しいことがわかりました。
再現する手順:
3 つのアイテムを作成しcat
ます。は、それらを正しい順序、つまり上、下に表示します。は、それらを上、下に示します。dog
horse
ListView
horse
cat
Database
cat
horse
更新を正しく削除するとhorse
(の上部ListView
、下部Database
) 、データベースでは削除されたのではなく、実際には.ListView
horse
cat
したがって、間違った削除が原因で、Database
を使用して を復元するListView
と、ListView が正しく表示されません。
これで物事が明確になることを願っています!
EDIT 2:これが私のテーブルの作成方法です:
public static final String TABLE_NAME = "history_table";
public static final String COL_TITLE = "title";
public static final String COL_CONTENT = "content";
public static final String COL_DATE = "date";
public static final String COL_TYPE = "type";
public static final String COL_ONGOING = "ongoing";
public static final String COL_DATA = "data";
public static final String COL_ID = "_id";
public static final String DATABASE_CREATE = "create table " + TABLE_NAME
+ "(" + COL_ID + " integer primary key autoincrement, " + COL_TITLE
+ " text not null, " + COL_CONTENT + " text not null, " + COL_DATE
+ " text not null, " + COL_TYPE + " text not null, " + COL_ONGOING
+ " text not null, " + COL_DATA + " text not null );";
これは getContentValues() です:
public ContentValues getContentValues() {
ContentValues values = new ContentValues();
values.put(History.COL_TITLE, "MyTitle");
values.put(History.COL_CONTENT, "MyContent");
values.put(History.COL_DATE, "Date placeholder");
values.put(History.COL_TYPE, "QuickNote");
values.put(History.COL_ONGOING, "Ongoing placeholder");
values.put(History.COL_DATA, new JSONObject(mDataHashMap).toString());
return values;
}
編集3:
基本的に、ListView とデータベースの項目の順序が異なるため、リスト内の位置による項目の削除は機能しないという事実に絞り込みました。したがって、考えられる解決策は、データベース内のアイテムの順序を逆にして ListView に一致させることです (良い考え/可能ですか?)。
編集 3.1:
https://stackoverflow.com/a/7348117/2442638
この降順が役立つ場合があります。どこに入れたらいいのかわからないけど
編集 3.5:
私は今、注文が機能しています。削除はほとんど機能しますが、最初の削除が機能しないという問題があります。残りの作業はその後です。私は_id
and でソートしていautoincrement
ます。おそらく、1 または 0 から始まり、リストはもう一方から始まります。もっと研究します