1

私はこれに対する答えを一日中探していたので、誰かが私を助けてくれることを願っています。

SQLite DBから作成されたListViewからアイテムを選択し、それを文字列に返して、SQLコマンドを実行してDBからレコードを削除できるようにするコードがあります。ただし、エントリをクリックすると、選択したものではなく、その下のエントリからデータが返されるため、間違ったインデックスを選択していると思われます。

Adam、Bob、Charlieのように3つのエントリがある場合、Adamをクリックすると、Bobが文字列に戻ります。ボブをクリックすると、チャーリーが返されます。Charlieをクリックすると、IndexOutOfBoundsExceptionがスローされます。

私のコードは次のとおりです。

public class viewdb extends ListActivity {

    private static final int DELETE_ID = Menu.FIRST + 1;
    private static final int EDIT_ID = Menu.FIRST + 2;
    private ArrayList<String> results = new ArrayList<String>();
    private String tableName = DBAdapter.DATABASE_TABLE;
    private SQLiteDatabase newDB;
    String strfieldName;
    String strSelFN;

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Log.d("CalledActivity", "OnCreate");
        Intent in = new Intent();
        openAndQueryDatabase();

        displayResultList();
        registerForContextMenu(getListView());

    }

    public void displayResultList() {
        TextView tView = new TextView(this);
        tView.setText("Fields in Database");
        getListView().addHeaderView(tView);

        setListAdapter(new ArrayAdapter<String>(this,
                android.R.layout.simple_list_item_1, results));
        getListView().setTextFilterEnabled(true);

    }

    public void openAndQueryDatabase() {
        try {
            DatabaseHelper dbHelper = new DatabaseHelper(
                    this.getApplicationContext());
            newDB = dbHelper.getWritableDatabase();
            Cursor c = newDB.rawQuery("SELECT Field_Name FROM " + tableName,
                    null);

            if (c != null) {
                if (c.moveToFirst()) {
                    do {
                        strfieldName = c.getString(c.getColumnIndex("Field_Name"));
                        results.add(strfieldName);
                    } while (c.moveToNext());
                }
            }
        } catch (SQLiteException se) {
            Log.e(getClass().getSimpleName(),
                    "Could not create or open the database");
            newDB.close();
        }

    }

    @Override
    protected void onListItemClick(ListView l, View v, int position, long id) {
        super.onListItemClick(l, v, position, id);
        Object o = this.getListAdapter().getItem(position);
        strSelFN = o.toString();
        getListView().showContextMenu();
    }

    @Override
    public void onCreateContextMenu(ContextMenu menu, View v,
            ContextMenuInfo menuInfo) {
        super.onCreateContextMenu(menu, v, menuInfo);
        menu.setHeaderTitle("Entry Menu");
        menu.add(Menu.NONE, EDIT_ID, Menu.NONE, R.string.strEdit);
        menu.add(Menu.NONE, DELETE_ID, Menu.NONE, R.string.strDelete);}

    @Override
    public boolean onContextItemSelected(MenuItem item) {

        if (item.getItemId() == DELETE_ID) {
            // newDB.execSQL("DELETE FROM " + tableName +
            // " WHERE Field_Name = '" + strSelFN + "'");
            Toast.makeText(this, "Field Deleted: " + strSelFN,
                    Toast.LENGTH_LONG).show();
            return true;
        }
        return false;

    }

}

主にDELETE_ID関数が機能する必要があるため、まだEDIT_IDを定義していません。

ありがとう

4

1 に答える 1

0

それ以外の

Object o = this.getListAdapter().getItem(position);

使用する

Object o = this.getListView().getItemAtPosition(position); 

によって返されるListAdapterはgetListAdapter、ヘッダービューを認識していないため、インデックスは1だけずれています。

于 2013-01-16T22:46:36.993 に答える