【问题标题】:GridView onItemClickListener and onItemSelected not reaching callback functionsGridView onItemClickListener 和 onItemSelected 未达到回调函数
【发布时间】:2014-11-17 18:33:18
【问题描述】:

最初我是适配器的 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 单元格中具有多个视图的东西都会破坏项目单击方法。此外,将 onClickListener 添加到 getView 中的各个视图也不起作用,即使添加了 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" />

【问题讨论】:

    标签: android gridview adapter onitemclicklistener


    【解决方案1】:

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

    【讨论】:

    • 只要项目中有可点击的视图,默认的 OnItemSelected 就不会触发。您必须将点击侦听器单独分配给可点击的子项或视图组“行”。
    【解决方案2】:

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

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

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

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

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

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

    【讨论】:

    • 我最初在 XML 中没有任何可点击或可聚焦的标签,我添加它们以尝试使其按预期工作。关于网格视图还有其他类似的问题,解决方案是添加那些可聚焦的标签或其他组合。如果我没有提到这一点,那么这个问题可能会被标记为重复并关闭,并且对任何人都没有帮助。 Stackoverflow 问题:)
    • @CQM :) 我知道。好的,您描述的问题是GridView 没有看到点击事件。这意味着,单击事件正在从您的 xml 到 GridView 的过程中被消耗。因此,RecyclingImageViewImageViewTintStateFrameLayout 本身正在消耗点击。这些视图中是否有任何附加了 OnTouchListener 或 OnCLickListener?
    • ImageViewTintState 确实会对点击做出反应,但令人困惑的是,我最初是使用相同的视图对象以编程方式生成此视图。 ImageViewTintState 会在触摸时显示它的点击状态,而 gridview 仍然会转到 onItemSelected,所以我可以按预期的方式处理点击
    • @CQM ImageViewTintState 很可能是罪魁祸首。但似乎您已经有了一个可行的解决方案。如果您的需求发生变化,并且您需要让 onItemClick(...) 正常工作,请发布您的适配器和自定义视图代码。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-01
    • 2023-03-18
    • 1970-01-01
    • 2012-11-05
    相关资源
    最近更新 更多