在listview中单击Item时,如何获取sqlite数据库中表的行id

时间:2014-12-30 09:20:44

标签: android sqlite listview android-listview onitemclicklistener

我的代码就在这里.............当从列表视图中删除一行时。列表视图的行的索引已更改,但数据库中的主键ID未更改。现在,当我单击该项目并将列表视图的单击项目的位置传递给新活动时。并尝试检索具有该ID的记录,它不会返回任何内容或返回不正确的数据。现在我的问题是如何检测数据库中listview的单击项的行id。 现在应该是onItemclick方法中的代码,以从数据库中检索正确的行。

感谢反对......!

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    myDb = new DBHelper(this);
    titles = myDb.getAllNames();
    times =  myDb.getAllTimes();

    ArrayAdapter<String> ad = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, titles);
    lv = (ListView) findViewById(R.id.listView1);
    lv.setAdapter(ad);

    lv.setOnItemClickListener(new OnItemClickListener() {

        @Override
        public void onItemClick(AdapterView<?> arg0, View arg1, int position, long arg3) 
        {

        }
    });



}

2 个答案:

答案 0 :(得分:1)

首先,你必须在数据库中编写一个查询并检索id。你必须在游标中返回id。

请参阅以下代码段:

public Cursor fetchAllNames() {

        Cursor mCursor = app.myDbHelper.MyDB().query("cardlist", new String[] {"cardid as _id","cardname","carddesc"},
                null, null, null, null, null);
        try{

            if (mCursor != null) {
                mCursor.moveToFirst();
            }
            return mCursor;
        }catch(Exception e)
        {
            return mCursor;
        }

    }

然后在你的java页面中:

Cursor cursor = myDB.fetchAllNames();

然后您可以通过以下方式获取数据库ID:

 lv.setOnItemClickListener(new OnItemClickListener() {

        @Override
        public void onItemClick(AdapterView<?> arg0, View arg1, int position, long arg3) 
        {
      if(cursor!=null){
                    System.out.println("position===>"+position);
                    if(cursor.moveToFirst()){
                        cursor.moveToPosition(position);   
                        String cardid =    cursor.getString(cursor.getColumnIndex("_id"));

                    }
                }
        }
    });

您将在字符串cardid中获取数据库ID。如果您使用的是SimpleCursorAdapter,则必须使用 _id ,否则您必须 _id替换为代表您在sqlite数据库中的ID的列名称。

答案 1 :(得分:1)

有一种简单的方法可以实现: 首先,创建一个对象来表示数据库中的一行。由于我不知道您的数据库包含什么,我们只需将其称为“标题”。

public class Title {
    private long id;
    private String title;
    // Constructor, setters and getters
}

然后,创建一个自定义适配器。它将存储一个Title集合,允许您在单击某个项目时获取它。

public class TitlesAdapter extends ArrayAdapter<Title> {
    private Context context;
    private List<Title> items;

    public TitlesAdapter(Context context, List<Title> items) {
        super(context, R.layout.row_draweritem, items);

        this.context = context;
        this.items = items;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) { /* ... */ }
}

然后,您可以轻松地在活动中设置适配器:

this.titlesAdapter = new TitlesAdapter(context, titles);
listView.setAdapter(this.titlesAdapter);

...并定义你的onItemClickListener,这样你就可以获取数据库中的行id

listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
    @Override
    public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
        long id = titlesAdapter.getItems().get(i).getId();
    }
});

您可以在本文中了解有关自定义适配器的更多信息:http://www.vogella.com/tutorials/AndroidListView/article.html