【问题标题】:Neither setOnItemSelectedListener nor setOnClickListener works for GridViewsetOnItemSelectedListener 和 setOnClickListener 都不适用于 GridView
【发布时间】:2016-12-01 18:39:38
【问题描述】:

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 上的焦点或单击任何项​​目时,不会调用任何其他侦听器。

任何人都可以提供有关如何使听众工作的提示吗?
GridView 的其他所有内容都按预期工作。

编辑:以下是每个网格单元格的布局:

<?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): 根据 Daniel Nugent 的the tip,出于测试目的,我从自定义项目视图布局中删除了 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。

【问题讨论】:

  • 我猜你需要onItemClickListener() 而不是onItemSelectedListener()
  • 很遗憾,GridView 没有 setOnItemClickedListener。没有 AdapterView.onItemSelectedListener。
  • GridView没有onItemClickListener()? API会被愚弄吗? developer.android.com/guide/topics/ui/layout/gridview.html
  • 你在使用任何第三方的gridview吗?
  • 对不起,我错了。 Android Studio IntelliSense 出现问题。我可能太依赖它了。你说得对,GridView 有 setOnClickListener。不幸的是,它不适用于带有触摸屏的桌子或带有遥控器的 Android TV。

标签: android android-gridview android-adapterview


【解决方案1】:

尝试使用OnItemClickListener 而不是onItemSelectedListener

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

onItemSelectedListener 将完成这项工作,如果您实现某种选择,如箭头或其他东西。

来自developer.android.com

当此视图中的项目已被调用时调用的回调方法 选择。此回调仅在新选择时调用 位置与先前选择的位置不同,或者如果 没有选择的项目。

如果需要,Impelmenters 可以调用 getItemAtPosition(position) 访问与所选项目关联的数据。

【讨论】:

  • 感谢您的帮助。 GridView 没有 setOnItemClickedListener。没有 AdapterView.onItemSelectedListener。我希望在焦点从一项移动到另一项时调用侦听器。
  • @Hong 你确定你真的在选择另一个项目吗?
  • @Hong GridView 确实有 OnItemClickListener 结帐这个例子:developer.android.com/guide/topics/ui/layout/gridview.html
  • 谢谢。对不起我错了。 Android Studio IntelliSense 出现问题。我可能太依赖它了。你说得对,GridView 有 setOnClickListener。不幸的是,它不适用于带有触摸屏的桌子或带有遥控器的 Android TV。
  • @Hong 和我一起来聊天室,避免在这里发太多 cmets Room for Sid and Hong
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多