Подтвердить что ты не робот

Как получить выбранный элемент в 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

}

Какая проблема? Спасибо вам

4b9b3361

Ответ 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();//

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