Как получить выбранный элемент в ListView?
в моем приложении Android я создал компонент ListView, называемый myList, и заполнил его объектами моего собственного типа:
class MyClass{
private String displayName;
private String theValue;
... //here constructor, getters, setters and toString() are implemented
}
Я использовал ArrayAdapter для привязки объектов ArrayList к 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
}
Какая проблема? Спасибо вам
Ответы
Ответ 1
По умолчанию, когда вы нажимаете элемент ListView, он не меняет свое состояние на "selected", поэтому, когда событие срабатывает, и вы делаете:
myList.getSelectedItem()
у метода нет возврата. Что вам нужно сделать, так это использовать позицию и получить подстилающий объект, выполнив следующие действия:
myList.getItemAtPosition(position)
Ответ 2
Вы используете обработчик Click, а не Select Handler. Список по умолчанию не предполагает выбора.
Что вы должны изменить в своем примере выше:
public void onItemClick(AdapterView<?> adapter, View v, int position, long id) {
MyClass item = (MyClass) adapter.getItem(position);
}
Ответ 3
В onItemClick:
String text = parent.getItemAtPosition(position).toString();
Ответ 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
фактически предоставляет вам позицию выбранного элемента.
Ответ 5
myList.setOnItemClickListener(new OnItemClickListener() {
public void onItemClick(AdapterView<?> adapter, View v, int position, long id) {
MyClass selItem = (MyClass) adapter.getItem(position);
}
}
Ответ 6
Использование 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
}
});
Ответ 7
В режиме touch mode нет фокуса и выбора. Для выбора пользовательского интерфейса следует использовать другой тип виджетов, например, радиокнопок.
Документация по ListView об этом ужасна, просто одно неясное упоминание о setSelection.
Ответ 8
MyClass selItem = (MyClass) myList.getSelectedItem();//
Вы никогда не создавали экземпляр своего класса.