【问题标题】:How do I get the cursor value of a ListView's item onItemClick?如何获取 ListView 项目 onItemClick 的光标值?
【发布时间】:2013-07-13 17:50:54
【问题描述】:

我创建了一个包含表(类别)和列(_id、标题等)的数据库。我想从我的数据库中读取这些类别的数据并将它们列在ListView 中。

这是我的代码:

   public class MainActivity extends listActivity{

    private ArrayAdapter arrayAdapter;
    ArrayList results = new ArrayList();
    ListView catlist;
    Cursor cur;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        catlist = getListView();

        int parentid = getIntent().getIntExtra("catid", 0);
        openAndQueryDatabase(parentid);

        displayCatListView();

    }

    private void displayCatListView() {

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


        catlist.setOnItemClickListener(new OnItemClickListener() {

               @Override
               public void onItemClick(AdapterView<?> parent, View v,
                 final int position, long id) {


                Toast.makeText(MainActivity.this,
                  "List View Clicked:" + position, Toast.LENGTH_LONG)
                  .show();
               }
              });     

    }

    private void openAndQueryDatabase(int parentid) {
        DataBaseHelper db = new DataBaseHelper(this);

        SQLiteDatabase dbr = db.getReadableDatabase();
        cur = dbr.rawQuery(
                "SELECT _id, title, has_sub FROM categories where parent_id=?",
                new String[] { String.valueOf(parentid) });


        if (cur != null) {
            while (cur.moveToNext()) {

                int cat_id = cur.getInt(cur.getColumnIndex("_id"));
                String cattitle = cur.getString(cur.getColumnIndex("title"));
                int has_sub = cur.getInt(cur.getColumnIndex("has_sub"));
                results.add(cat_id + cattitle + has_sub);
            }
            cur.close();
        }

        db.close();

    }
}
  1. 我可以在ItemClick 上获取项目的位置,但我想在ItemClick 上获取他们所在行的_id。我该怎么做?
  2. 我是新手。我的代码有错误吗?

非常感谢。

【问题讨论】:

    标签: android android-listview onitemclicklistener onitemclick


    【解决方案1】:

    使用 CursorAdapter(http://developer.android.com/reference/android/widget/CursorAdapter.html) 代替,当您使用 ArrayAdapter 时,它会超出内存分配,并且如果 db 发生更改,您也不会收到通知。

    此外,如果使用 CursorAdapter,您将拥有

    public void onItemClick(AdapterView<?> parent, View v, final int position, long id)
    

    “id”参数将与表的 _id 字段一致

    获取整行就行了

    adapter.getItem(int position)
    

    【讨论】:

    • 这是一个更好的答案
    • 从来没有新的 id 以这种方式工作。为这个有用的信息 +1。
    【解决方案2】:

    代替

    int cat_id = cur.getInt(cur.getColumnIndex("_id"));
    String cattitle = cur.getString(cur.getColumnIndex("title"));
    int has_sub = cur.getInt(cur.getColumnIndex("has_sub"));
    results.add(cat_id + cattitle + has_sub);
    

    创建一个 Category 类来包含这些值,并使用参数化的 ArrayList。类似的东西

    class Category {
        public int cat_id;
        public String cattitle;
        public int has_sub;
    
        public Category(int cat_id, ...) {
            // constructor logic here
        }
    }
    

    results.add(new Category(cat_id, cattitle, has_sub));
    

    有了这个,你可以这样设置 onItemClickListener:

            catlist.setOnItemClickListener(new OnItemClickListener() {
    
               @Override
               public void onItemClick(AdapterView<?> parent, View v,
                 final int position, long id) {
                     Category clickedCategory = results.get(position);
                     int id = clickedCategory.cat_id;
    
                     // do something with id
               }
              });     
    

    你的ArrayList就是你的ArrayAdapter的数据源,position对应的是里面点击的Category的索引。

    【讨论】:

    • 感谢您的回答。您能否对此部分进行更多解释:class Category { public int cat_id; public String cattitle; public int has_sub; public Category(int cat_id, ...) { // constructor logic here } } 或链接一个完整的示例?
    • @ErikR 你能否指出一个关于使用对象而不是数组列表的完整教程?
    • @numediaweb 我上面的代码使用 Ji.Mack 代码中的原始 ArrayList 来保存 Category 类的实例。所以我们使用带有 ArrayList 的对象,而不是代替。
    猜你喜欢
    • 1970-01-01
    • 2012-06-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多