2013-01-16 37 views
1

我一直在寻找答案,希望有人能帮助我。Android从上下文菜单中选择错误的数据

我有一段代码应该从一个从SQLite数据库创建的ListView中选择一个项目,并将其返回给一个字符串,以便我可以运行SQL命令从数据库中删除记录。然而,当点击条目时,它会从下面的条目中返回数据而不是所选的条目,所以我相信它是在错误的索引上选择的。

如果有3个条目,说亚当,鲍勃和查理,如果我点击亚当,它会返回鲍勃的字符串;如果我点击鲍勃,它会返回查理;如果我点击查理它会抛出一个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; 

    } 

} 

我还没有定义EDIT_ID但作为需要DELETE_ID功能主要工作。

感谢

回答

0

而不是

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

使用

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

通过getListAdapter返回ListAdapter不知道你的头视图,因此该指数是关闭的1

+0

完美,谢谢dokkaebi! – CSUK

相关问题