2016-12-01 4 views
1

Элемент GridView является следующее:Ни setOnItemSelectedListener, ни setOnClickListener работает 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 работает должным образом.

Edit: Ниже приведен макет для каждой ячейки сетки:

<?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> 

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

Edit (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 никогда не вызываются независимо от того, является ли я используйте мышь или пульт дистанционного управления, чтобы щелкнуть элемент.

+0

Я думаю, что вам нужно 'onItemClickListener()' вместо 'onItemSelectedListener()' – Opiatefuchs

+0

К сожалению, GridView не имеет setOnItemClickedListener. Нет AdapterView.onItemSelectedListener. – Hong

+0

У GridView нет onItemClickListener()? Оправдывается ли API? https://developer.android.com/guide/topics/ui/layout/gridview.html – Opiatefuchs

ответ

0

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

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

onItemSelectedListener будет делать работу, если вы реализует какой-то отбор, как стрелки или какой-либо другой вещи.

От метода developer.android.com

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

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

+0

Спасибо, что протянули руку. В GridView нет setOnItemClickedListener. Нет AdapterView.onItemSelectedListener. Я хочу, чтобы слушатель вызывался, когда фокус перемещается из одного элемента в другой. – Hong

+0

@ Чем вы уверены, что на самом деле выбираете другой предмет? – Sid

+0

@Hong GridView имеет проверку OnItemClickListener в этом примере: https://developer.android.com/guide/topics/ui/layout/gridview.html – Sid

Смежные вопросы