0

我有一个带有联系人信息(姓名,电话号码)的 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);

那是我的列表视图/适配器的代码

OBS:如果你能解释更好(没有tuts链接(如果可能的话更好))

4

2 回答 2

1

(我看到您正在自己处理光标并使用 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 是将数据从游标绑定到 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);
于 2012-09-18T18:40:23.000 回答
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);
    }
});
于 2012-09-18T18:29:45.030 回答