最初我是适配器的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" />
答案 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
。
在我看来,这是额外的工作,不需要做。