0

我正在构建一个应用程序,在该应用程序中,我将数据库中的数据填充到我的活动列表视图中。现在,在 longItemClick 侦听器上,我想从数据库中删除该值并更新应用程序中的列表视图。

这是我在列表视图上的 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;
}

检索和插入数据一切都很完美,但删除特定行对我不起作用。现在我已经使用 toast 做了一些操作并且它正在工作,我应该怎么做,从列表视图中删除行后数据库数据更新。请给我任何想法来克服这个问题。

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

最合适的解决方案是使用 Loaders.. 尤其是 CursorLoader 和 Content Provider。如果 Content Provider 对于您正在做的事情来说太过分了,请尝试使用 commonsware 中的 CursorLoader。删除后的更新是自动发生的,而不是在 ui 线程中,这很好。 https://github.com/commonsguy/cwac-loaderex .. 一旦你明白这一点,它就很容易了。

但是,如果您仍想根据您的代码删除该行。只需在您的长按侦听器中将其删除即可。但在那之后刷新适配器。 如何刷新Android列表视图?

于 2012-11-14T11:56:18.120 回答
0

要更新列表..首先调用您从构建器正按钮中指定删除查询的方法。

之后从HistoryNamesList数组列表中删除项目

现在从数据库和数组列表中删除了数据,但列表视图仍然显示以前的数据,因此您必须通知列表视图适配器,如下所示 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 回答