ListView андроида не слушает ни одного клика - PullRequest
2 голосов
/ 11 февраля 2010

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

Но мой OnItemClickListener не вызывается! Я нашел этот очень похожий вопрос , но решение (запретить просмотр элементов списка, чтобы получить фокус) не работает для меня Тем не менее, длинный щелчок ловится - мой OnItemLongClickListener вызывается. Пожалуйста, посмотрите на следующий код и попробуйте сами. Это упрощенная версия моего кода, показывающая ошибочное поведение. Кстати: я использую Andriod SDK 2.0 с Eclipse 3.5.1.

package de.sacherkhoudari.listtest;

import java.util.LinkedList;
import java.util.List;

import android.app.ListActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.Toast;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.AdapterView.OnItemLongClickListener;

public class ListTest extends ListActivity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        final List<ListEntry> lEntries = new LinkedList<ListEntry>();
        for ( int ii = 0; ii < 10; ii++ )
            lEntries.add( new ListEntry( "Entry " + ii ) );

        setListAdapter( new ArrayAdapter<ListEntry>( this, R.layout.list_item, lEntries ) );

        ListView lv = getListView();
        lv.setTextFilterEnabled(true);

        lv.setOnItemClickListener( new OnItemClickListener() {
            public void onItemClick( AdapterView<?> parent, View view, int position, long id ) {
                Toast.makeText( ListTest.this, "ItemClick at item " + lEntries.get(position).toString(), Toast.LENGTH_LONG ).show();
            }
        });

        lv.setOnItemLongClickListener( new OnItemLongClickListener() {
            public boolean onItemLongClick( AdapterView<?> parent, View view, int position, long id ) {
                Toast.makeText( ListTest.this, "ItemLongClick at item " + lEntries.get(position).toString(), Toast.LENGTH_LONG ).show();
                return false;
            }
        });

        setContentView(lv);
    }
}

class ListEntry {
    private String name;

    public ListEntry( String s ) {
        name = s;
    }

    public String toString() {
        return name;
    }
}

Пока что код Java ... вот и макет list_item.xml

<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:padding="10dp"
    android:textSize="16sp"
    android:focusable="false" >
</TextView>

Примечание: android:focusable="false" не имеет никакого эффекта.

Спасибо!
Захер

Ответы [ 2 ]

2 голосов
/ 11 февраля 2010

Когда вы добавляете макеты с помощью setContentView, представления внутри этих макетов обновляются. По умолчанию ListActivity имеет очень простой макет (об этом читайте здесь ), даже если вы не добавляете свой собственный макет. Итак, в основном в вашем первом примере:

  • Сначала вы добавляете слушателя в ListView по умолчанию в ListActivity
  • Затем вы выбрасываете этот ListView, используя setContentView, чтобы создать новый макет с новым ListView
  • Тогда вы никогда не зарегистрируете нового слушателя для нового ListView из вашего нового макета.

Принимая во внимание, что когда вы открываете setContentView в своем коде, вы только когда-либо работаете со своим собственным ListView, и все работает как положено.

1 голос
/ 11 февраля 2010

Переместите setContentView(lv); сразу после получения ListView

ListView lv = getListView();
setContentView(lv);
lv.setTextFilterEnabled(true);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...