0

データベースからアクティビティのリストビューにデータを入力するアプリケーションを構築しています。ここで、longItemClick Listenerで、データベースからその値を削除し、アプリのリストビューを更新します。

リストビューのlongClickListenerのコードは次のとおりです。

private ListView showing_history;
private ListAdapter mHistoryListAdapter;
private ArrayList<SearchHistoryDetails> searchArrayList;
private ArrayList<SearchHistoryDetails> HistoryObjArrayList;


    mHistoryListAdapter = new ArrayAdapter<String>(this,
            R.layout.mylistlayout, populateList());
    showing_history.setAdapter(mHistoryListAdapter);
    HistoryObjArrayList = new ArrayList<SearchHistoryDetails>();

/**
     * Long tap on listview to delete the selected item from the history
     * list.
     * */
    showing_history
            .setOnItemLongClickListener(new OnItemLongClickListener() {

                @Override
                public boolean onItemLongClick(AdapterView<?> arg0,
                        View arg1, int arg2, long arg3) {
                    final AlertDialog.Builder b = new AlertDialog.Builder(
                            MainActivity.this);
                    b.setIcon(android.R.drawable.ic_dialog_alert);
                    b.setMessage("Delete this from history?");
                    b.setPositiveButton("Yes",
                            new DialogInterface.OnClickListener() {
                                public void onClick(DialogInterface dialog,
                                        int whichButton) {
                                    Toast.makeText(getApplicationContext(),
                                            "Yes", Toast.LENGTH_LONG)
                                            .show();
                                }
                            });
                    b.setNegativeButton("No",
                            new DialogInterface.OnClickListener() {
                                public void onClick(DialogInterface dialog,
                                        int whichButton) {
                                    dialog.cancel();
                                }
                            });

                    b.show();
                    return true;
                }
            });

このコードによって、私はデータベースにデータを挿入しています:

/**
 * Inserting the string when user searches for anything into the database.
 * */
public void insertHistory(SearchHistoryDetails paraHistoryDetailsPojoObj) {

    AndroidOpenDbHelper androidOpenDbHelperObj = new AndroidOpenDbHelper(
            this);

    SQLiteDatabase sqliteDatabase = androidOpenDbHelperObj
            .getWritableDatabase();

    ContentValues contentValues = new ContentValues();

    contentValues.put(AndroidOpenDbHelper.COLUMN_NAME_HISTORY_STRING,
            paraHistoryDetailsPojoObj.getHistoryName());
    @SuppressWarnings("unused")
    long affectedColumnId = sqliteDatabase.insert(
            AndroidOpenDbHelper.TABLE_NAME_HISTORY, null, contentValues);

    sqliteDatabase.close();

}

データベースからデータを取得し、リストビューに再入力するコードは次のとおりです。

public List<String> populateList() {

    List<String> HistoryNamesList = new ArrayList<String>();

    AndroidOpenDbHelper openHelperClass = new AndroidOpenDbHelper(this);

    SQLiteDatabase sqliteDatabase = openHelperClass.getReadableDatabase();

    Cursor cursor = sqliteDatabase
            .query(AndroidOpenDbHelper.TABLE_NAME_HISTORY,
                    new String[] { AndroidOpenDbHelper.COLUMN_NAME_HISTORY_STRING },
                    null, null, null, null, AndroidOpenDbHelper.ID
                            + " DESC");

    startManagingCursor(cursor);

    while (cursor.moveToNext()) {
        String ugName = cursor
                .getString(cursor
                        .getColumnIndex(AndroidOpenDbHelper.COLUMN_NAME_HISTORY_STRING));

        SearchHistoryDetails histPojoClass = new SearchHistoryDetails();
        histPojoClass.setHistoryName(ugName);

        searchArrayList.add(histPojoClass);

        HistoryNamesList.add(ugName);
    }

    sqliteDatabase.close();

    int history_db = cursor.getCount();

    if (history_db == 0) {
        history_layout.setVisibility(LinearLayout.GONE);
    } else {
        history_layout.setVisibility(LinearLayout.VISIBLE);
    }

    return HistoryNamesList;
}

データの取得と挿入はすべて完璧ですが、特定の行の削除はうまくいきません。現在、トーストを使用していくつかのアクションを実行しましたが、機能しています。リストビューから行を削除した後、データベースデータが更新されるようにするにはどうすればよいですか。この問題を克服するためのアイデアを教えてください。

4

4 に答える 4

1

これを試して..、。

b.setPositiveButton("Yes", new DialogInterface.OnClickListener() {
  public void onClick(DialogInterface dialog, int whichButton) {
            DatabaseHandler db=new DatabaseHandler(getApplicationContext());
            db.delete(arg3+"");
            list.remove(position);
            YourActivity.this.adapter.notifyDataSetChanged();
  }
});

およびDatabaseHandlerクラス

public void delete(String id)
{
    SQLiteDatabase db = this.getReadableDatabase();
    db.delete(TABLE_NAME, KEY_ID + "=?", new String[]{id});
    db.close();
}
于 2012-11-14T16:11:47.037 に答える
0

最も適切な解決策は、ローダーを使用することです。特に、コンテンツプロバイダーと一緒にCursorLoaderを使用します。コンテンツプロバイダーがあなたがしていることにやり過ぎである場合は、commonswareのCursorLoaderを試してください。削除後の更新は自動的に行われ、UIスレッドでは行われません。 https://github.com/commonsguy/cwac-loaderex ..頭を悩ませれば、とても簡単です。

ただし、それでもコードに従って行を削除する場合。長押しリスナーで削除するだけです。ただし、その後、アダプターを更新します。 Androidのリストビューを更新する方法は?

于 2012-11-14T11:56:18.120 に答える
0

リストを更新するには..最初に、ビルダーのポジティブボタンからクエリを削除を指定したメソッドを呼び出します。

その後、HistoryNamesList配列リストからアイテムを削除します

これで、データベースとarraylistの両方からデータが削除されましたが、listviewには以前のデータが引き続き表示されるため、以下に示すようにlistviewアダプターに通知する必要があります。 adapter.notifyDataSetChanged(); adapter.notifyDataSetInvalidated();

于 2012-11-14T12:07:59.937 に答える
0

解決しました!

onCLick()で行われた変更:

public void onClick(DialogInterface dialog,
                                        int whichButton) {

                                    HistoryNamesList.remove(pos);
                                    ((BaseAdapter) mHistoryListAdapter)
                                            .notifyDataSetChanged();

                                }
于 2012-11-15T08:24:31.837 に答える