2011-01-29 2 views
17

в моем Android приложения, которое я создал компонент ListView с именем MyList, и наполнил ее с объектами моего собственного типа настраиваемого:Как получить выбранный элемент из ListView?

class MyClass{ 

    private String displayName; 
    private String theValue; 
... //here constructor, getters, setters and toString() are implemented 

} 

Я использовал ArrayAdapter для связанной с ArrayList theObjects с MyList:

ArrayAdapter<MyClass> adapter= 
       new ArrayAdapter<MyClass>(this, R.layout.lay_item, theObjects); 
myList.setAdapter(adapter); 

Это нормально работает, список заполняется и т. Д., Но когда я пытаюсь получить доступ к выбранному элементу, я получаю объект Null. Я сделал это, используя

myList.setOnItemClickListener(new OnItemClickListener() { 

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

MyClass selItem = (MyClass) myList.getSelectedItem(); // 
String value= selItem.getTheValue(); //getter method 

} 

В чем проблема? Спасибо

ответ

-2

MyClass selItem = (MyClass) myList.getSelectedItem(); //

Вы никогда не создавали экземпляр своего класса.

+3

Он сказал, что он может просмотрите материал, поэтому класс должен быть создан. – xandy

19

Вы используете обработчик Click, а не обработчик выбора. Список по умолчанию не предполагает выбора.

Что следует изменить в вашем примере выше, является

public void onItemClick(AdapterView<?> adapter, View v, int position, long id) { 
    MyClass item = (MyClass) adapter.getItem(position); 
} 
34

По умолчанию при нажатии на элемент ListView это не меняет свое состояние на «выбрано». Итак, когда событие срабатывает, и вы делаете:

myList.getSelectedItem(); 

Метод не имеет ничего, чтобы вернуться. То, что вы должны сделать, это использовать положение и получить базовый объект, выполнив:

myList.getItemAtPosition(position); 
+1

Как это помогает найти индекс выбранного элемента?Как бы вы получили позицию в первую очередь? – Zelphir

+0

@ Zelphir Позиция передается в onItemClick (адаптер AdaptView , View v, int position, long id) метод – RustyFluff

+0

Отличный ответ, должен быть принят – Michael

3
myList.setOnItemClickListener(new OnItemClickListener() { 
    public void onItemClick(AdapterView<?> adapter, View v, int position, long id) { 
     MyClass selItem = (MyClass) adapter.getItem(position); 
    } 
} 
5

На onItemClick:

String text = parent.getItemAtPosition(position).toString(); 
1

В touch mode, нет фокуса и нет выбора , Для выбора пользовательского интерфейса должен использовать другой тип виджетов, например, радиокнопки.

Документация по ListView об этом ужасно, только одно неясное упоминание о setSelection.

4

Поскольку onItemClickLitener() сам предоставит вам указатель выбранного элемента, вы можете просто сделать getItemAtPosition(i).toString(). Фрагмент кода приведен ниже: -

listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
     @Override 
     public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) { 

      String s = listView.getItemAtPosition(i).toString(); 

      Toast.makeText(activity.getApplicationContext(), s, Toast.LENGTH_LONG).show(); 
      adapter.dismiss(); // If you want to close the adapter 
     } 
    }); 

На описанном выше способе параметр i фактически дает положение выбранного элемента.

1

Использование setOnItemClickListener правильный ответ, но если у вас есть клавиатура, то вы можете изменить выбор, даже со стрелками (нет щелчка выполняется), таким образом, вы должны реализовать также setOnItemSelectedListener:

myListView.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { 
      @Override 
      public void onItemSelected(AdapterView<?> adapterView, View view, int position, long l) { 
    MyObject tmp=(MyObject) adapterView.getItemAtPosition(position); 
     } 
      @Override 
      public void onNothingSelected(AdapterView<?> adapterView) { 
       // your stuff 
      } 
     }); 
Смежные вопросы