ListView上的setOnItemClickListener如何显示数据库值

时间:2012-09-18 18:15:06

标签: android database listview

我有一个ListView,其中包含联系信息(姓名,电话号码),所以当我点击联系人姓名时,我希望在对话框中显示其名称和电话号码(其中已有代码)是:

      public void ShowMessage(String titulo,String msg){
        AlertDialog.Builder dialogo = new AlertDialog.Builder(this);        
        dialogo.setMessage(msg);        
        dialogo.setTitle(titulo);       
        dialogo.setNeutralButton("OK", null);       
        dialogo.show();
    }

然后我看到了setOnItemClickListener,但是当我尝试将它放在我的.java文件中时,它甚至没有建议代码,是否有人知道为什么或如何做到这一点?

编辑:

        //LISTVIEW database CONTATO
    ListView user = (ListView) findViewById(R.id.lvShowContatos);
    //String = simple value ||| String[] = multiple values/columns
    String[] campos = new String[] {"nome", "telefone"};

     list = new ArrayList<String>();
    Cursor c = db.query( "contatos", campos, null, null, null, null, null);
    c.moveToFirst();
    String lista = "";
    if(c.getCount() > 0) {
        while(true) {
           list.add(c.getString(c.getColumnIndex("nome")).toString());
            if(!c.moveToNext()) break;
        }
    }

    ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,
            android.R.layout.simple_list_item_1, list);

    user.setAdapter(adapter);

这是我的listview / adapter

的代码

OBS:如果你能解释更好(没有关联(如果可能的话,更好))

2 个答案:

答案 0 :(得分:1)

(我看到你自己正在处理一个Cursor并使用ArrayAdapter,了解SimpleCursorAdapter会为你做这个。请参阅下面的注释。)

无论如何,将Cursor更改为类变量并尝试在onCreate()

中添加它
user.setOnItemClickListener(new OnItemClickListener() {
    @Override
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
        c.moveToPosition(position);
        String nome = c.getString(c.getColumnIndex("nome"));
        String telefone = c.getString(c.getColumnIndex("telefone"));
        showMessage(nome, telefone);
    }
});

您并不具体说明标题和消息与联系人姓名的关联方式,因此我将该部分更新了。


类变量只是在一个地方定义的变量,使整个类可见。例如,这会将c转换为类变量,因此您可以在onItemClick()中使用它:

public class MyActivity extends Activity {
    Cursor c;

    public void onCreate(...) {
        ...
        c = db.query( "contatos", campos, null, null, null, null, "nome");
        ...
    }
}

了解您可以简化阅读联系人的方式:

list = new ArrayList<String>();
Cursor c = db.query("contatos", campos, null, null, null, null, "nome");
int nameIndex = c.getColumnIndex("nome");
while(c.moveToNext()) {
    list.add(c.getString(nameIndex));
}

我做了一些改变:

  • 您只需要获取"nome"列的索引一次,除非您更改光标,否则它不会更改。
  • 如果有要阅读的数据,则
  • moveToFirst()会返回true,如果没有,则会false

与现有方法相比,写入速度更快,运行速度更快。


SimpleCursorAdapter是将数据从Cursor绑定到ListView的标准适配器。这将为您提供与原始方法相同的结果,但代码更少 如何使用SimpleCursorAdapter:

Cursor c = db.query("contatos", campos, null, null, null, null, "nome");
SimpleCursorAdapter adapter = new SimpleCursorAdapter(this,
        android.R.layout.simple_list_item_1, c, 
        new String[] {"nome"}, new int[] {android.R.id.text1});
user.setAdapter(adapter);

答案 1 :(得分:0)

假设ListView中使用的适配器具有自定义类型(我将其称为ContactInfo),则以下内容应该有效。

getListView().setOnItemClickListener(new OnItemClickListener() {
    @Override
    public void onItemClick(AdapterView<?> parent, View view, int position,
            long id) {
        // Get String provided to this particular row
        ContactInfo info = getListView().getAdapter().getItem(position);

        // Construct title, message etc from information within info
        showMessage("Contact Info", info);
    }
});