Android: получить идентификатор выбранного элемента из списка, созданного с помощью курсора - PullRequest
0 голосов
/ 19 марта 2012

Внутри моего класса Activity я переопределяю onCreateDialog() метод с кодом, как показано ниже. Диалог теперь перечисляет все элементы из моего списка контактов.

Когда пользователь щелкает элемент из этого списка, я хочу получить идентификатор контакта выбранного элемента, то есть значение поля Phone._ID.

В настоящее время я получаю только позицию (индекс) выбранного элемента внутри which аргумент OnClickListener. Если бы список был показан в ListActivity, я, вероятно, мог бы использовать:

getListView().getItemIdAtPosition(which);

Но здесь я не могу получить ссылку на ListView. Как я могу получить идентификатор выбранного элемента из диалогового окна списка, созданного с помощью курсора.

protected Dialog onCreateDialog(int id) {
  String[] projection = new String[] {
                Phone._ID,
                Phone.DISPLAY_NAME,
                Phone.NUMBER
        };
  Cursor cursor = managedQuery(ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
                projection, null, null, null);
  return new AlertDialog.Builder(ContactActivity.this)
            .setTitle("Select Contacts")
            .setCursor(cursor,
               new DialogInterface.OnClickListener() {

            public void onClick(DialogInterface dialog, int which) {

               /* User clicked on a contact item */

               Toast.makeText(getApplicationContext(), 
                            "CLICKED-"+which,
            Toast.LENGTH_SHORT).show();

            }
               }, ContactsContract.Contacts.DISPLAY_NAME)
           .create();

}

Заранее спасибо

1 Ответ

0 голосов
/ 20 марта 2012

Я нашел решение для этого сам.Ниже приведен код, который я сейчас использую.

Я объявил курсор моего запроса в списке контактов как окончательный.и использовал тот же объект курсора внутри метода onClick, чтобы получить запись в позиции, по которой щелкнули, используя moveToPosition() метод Cursor.Также обратите внимание, что я должен использовать cursor.moveToFirst(); внизу onClick.В противном случае диалоговое окно кажется пустым, когда я снова вызываю его (я не уверен, почему это происходит).

protected Dialog onCreateDialog(int id) {
String[] projection = new String[] {
            Phone._ID,
            Phone.DISPLAY_NAME,
            Phone.NUMBER
    };
final Cursor cursor = managedQuery(ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
            projection, null, null, null);
return new AlertDialog.Builder(ContactActivity.this)
        .setTitle("Select Contacts")
        .setCursor(cursor,
        new DialogInterface.OnClickListener() {

          public void onClick(DialogInterface dialog, int which) {

           /* User clicked on a contact item */
            if(cursor.moveToPosition(which)){

             long contactId=cursor.getLong(0);
             String name=cursor.getString(1);
             String number=cursor.getString(2);
             Toast.makeText(getApplicationContext(),
                     "You selected: ["+contactId+"]" 
                      + name + " , " +number,
                     Toast.LENGTH_SHORT)
                   .show();
            }
            cursor.moveToFirst();//Reset the position

          }
       }, ContactsContract.Contacts.DISPLAY_NAME)
       .create();

}

Но я не чувствую, что это правильный способ сделать это.Так что я не отмечаю это как ответ на этот вопрос.Я оставлю этот вопрос открытым в течение некоторого времени и надеюсь, что кто-то может предложить лучшие предложения.

ОБНОВЛЕНИЕ: Помечено как ответ, поскольку ответа нет.

...