Ни setOnItemSelectedListener, ни setOnClickListener не работают для GridView

GridView является следующим:

<GridView
    android:id="@+id/gridview"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:layout_margin="0dp"
    android:horizontalSpacing="0dp"
    android:numColumns="2"
    android:stretchMode="columnWidth"
    android:verticalSpacing="0dp"
    android:fadeScrollbars="false"
    android:focusable="true"
    android:focusableInTouchMode="true"
    android:descendantFocusability="afterDescendants"/>

Java-код выглядит следующим образом:

gridview = (GridView) findViewById(R.id.gridview);
gridview.setNumColumns(iColumnCount);
gridview.setAdapter(dta);
gridview.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
    @Override
    public void onItemSelected(AdapterView<?> adapterView, View view, int iPosition, long l) {
        utility.logd("gridview", "selected item position:" + iPosition);
    }

    @Override
    public void onNothingSelected(AdapterView<?> adapterView) {
        utility.logd("gridview", "nothing selected.");
    }
});
gridview.setOnClickListener(new OnClickListener() {
    @Override
    public void onClick(View view) {
        utility.logd("gridview", "item clicked");
    }
});

Только onNothingSelected() вызывается один раз после запуска приложений. Ни один из других слушателей не вызывается, когда фокус на GridView изменяется с помощью пульта дистанционного управления или когда щелкается любой элемент.

Кто-нибудь может предложить совет, как заставить слушателей работать?
Все остальное в GirdView работает как положено.

Изменить: ниже приведен макет для каждой ячейки сетки:

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:padding="0dp"
    android:layout_gravity="center"
    android:id="@+id/biyee_relativeLayoutRoot">

    <ImageButton
        android:id="@+id/imageButton"
        android:background="@drawable/button_background"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:contentDescription="snapshot"
        android:layout_gravity="center"
        android:scaleType="fitXY"
        android:adjustViewBounds="true"
        android:layout_margin="0dp"
        android:padding="10dp"
        android:src="@drawable/ic_launcher"
        android:onClick="onClick_imageButton"/>

    <LinearLayout
        android:id="@+id/linearLayoutCaption"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="@color/black_overlay"
        android:orientation="vertical"
        android:layout_margin="10dp"
        android:padding="5dp">

        <TextView
            android:id="@+id/textViewName"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="top"
            android:text="Name"
            android:textAppearance="?android:attr/textAppearanceSmall" />

        <TextView
            android:id="@+id/textViewModel"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Model"
            android:textAppearance="?android:attr/textAppearanceSmall"/>

        <TextView
            android:id="@+id/textViewTime"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="bottom"
            android:text="Time"
            android:textAppearance="?android:attr/textAppearanceSmall" />
    </LinearLayout>

    <TextView
        android:id="@+id/textViewPosition"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="bottom"
        android:text="n"
        android:textAppearance="?android:attr/textAppearanceSmall"
        android:layout_margin="15dp"/>

</FrameLayout>

Редактировать (2): По совету Дэниела Ньюджента, я удалил ImageButton из пользовательского макета представления элементов для целей тестирования, и OnItemSelectedListener начал работать отлично. Поэтому виновником является ImageButton. Кажется, любой кликабельный объект разрушит OnItemSelectedListener.

Редактировать (3): Для тестирования я использовал следующий макет для пользовательского представления элемента:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="300dp"
    android:layout_height="300dp"
    android:orientation="vertical"
    android:background="@color/red">

</LinearLayout>

OnItemSelectedListener работает отлично, но OnClickListener и OnItemClickListener никогда не вызываются независимо от того, использую ли я мышь или пульт дистанционного управления для щелчка по элементу.

1 ответ

Попробуйте использовать OnItemClickListener вместо onItemSelectedListener

gridview.setOnItemClickListener(new OnItemClickListener() {
        public void onItemClick(AdapterView<?> parent, View v,
                //Your Logic here
        }
);

onItemSelectedListener сделает работу, если вы реализуете какой-то выбор, например, стрелки или что-то другое.

От developer.android.com

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

Импелментаторы могут вызывать getItemAtPosition(position), если им требуется доступ к данным, связанным с выбранным элементом.

Другие вопросы по тегам