GridView onItemClickListener和onItemSelected未达到回调函数

时间:2014-11-17 18:33:19

标签: android gridview adapter onitemclicklistener

最初我是适配器的getView()以编程方式创建视图,其中只有一个图像加载,gridview上的onItemClick正在这里工作。我需要在每个单元格中使用更复杂的视图,因此我将getView()更改为使用XML文件,现在没有gridview侦听器工作。切换回编程视图getView()按预期工作。

所以这是我的适配器单元格的XML:

注意:我在程序化视图中使用了相同类型的扩展对象(RecyclingImageView,ImageViewTintState),因此不需要查看它们的代码

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/containerView"
android:focusable="false"
android:clickable="true"
android:focusableInTouchMode="false"
android:layout_width="match_parent"
android:layout_height="match_parent">

<com.whosay.talent.views.RecyclingImageView
    android:id="@+id/gridImage"
    android:layout_width="match_parent"
    android:focusable="false"
    android:focusableInTouchMode="false"
    android:layout_height="match_parent"
    app:tint="@color/image_click_state"
    android:scaleType="centerCrop" />

<com.whosay.talent.views.ImageViewTintState
    android:id="@+id/videoIconView"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:focusable="false"
    android:focusableInTouchMode="false"
    android:layout_gravity="center"
    android:src="@drawable/icon_play_img"
    app:tint="@color/image_click_state"
    android:visibility="invisible" />

正如您所看到的,我尝试过其他问题所提出的onFocusable技巧。我也尝试使用更多基本视图,例如ImageView,但似乎在gridview单元格中有多个视图的任何内容都会破坏项目点击方法。此外,即使在添加getView后,将onClickListener添加到clickable:true中的各个视图也不起作用

这是我的Gridview的xml。

<?xml version="1.0" encoding="utf-8"?>

<GridView
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/imageGrid"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:layout_margin="1dp"
    android:background="@android:color/white"
    android:gravity="center"
    android:horizontalSpacing="1dp"
    android:numColumns="3"
    android:stretchMode="columnWidth"
    android:verticalSpacing="1dp" />

2 个答案:

答案 0 :(得分:1)

通过将onClickListeners添加到getView()中的元素上来解决这个问题,仍然感到困惑,为什么我不得不求助于此

答案 1 :(得分:1)

我认为问题在于这些陈述:

android:focusable="false"
android:clickable="true"
android:focusableInTouchMode="false"

我认为您不需要任何,尤其是android:clickable="true"。此语句实质上阻止click事件传播到GridView,通常会调用onItemClick(...)。由于您的FrameLayout是可点击的(因此会消耗该事件),因此网格项不是。

尝试从xml中的每个标记中删除所有这些语句。您还需要删除在OnClickListeners中设置的getView(...),因为他们将标记clickable设置为true。

在每个网格项内的小部件上设置OnClickListeners没有任何问题。但是,您无法使用listSelector提供项目点击的视觉反馈。如果您需要长按功能,则需要设置OnLongClickListeners

在我看来,这是额外的工作,不需要做。