【问题标题】:OnItemClickListener Not Triggered on Android GridViewOnItemClickListener 未在 Android GridView 上触发
【发布时间】:2012-01-01 06:53:34
【问题描述】:

我有一个由 Adapter 填充的 Gridview,它返回 LinearLayouts,每个包含一个 ImageButton 和 TextView。

在适配器中,我将 onClick 和 onLongClick 事件绑定到 ImageButton。

我正在尝试将 OnItemClickListener 绑定到 gridview,但我不知道为什么 onItemclicked 从未启动。

这是我没有任何东西的第 6 个小时。

顺便说一句; OnItemSelectListener 在 Grid 上完美运行。

我正在检查是否有一段代码意外处理了 onItemClicked 但尚未捕获。

我需要帮助。

gridView = (GridView) layoutInflater.inflate(R.layout.gridview, null);
gridView.setOnItemClickListener(new ItemClickListener());
. 
.
.

//inner handler class
class ItemClickListener implements AdapterView.OnItemClickListener {
    @Override
    public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
        Toast.makeText(mainActivity.getApplicationContext(),view + " clicked at pos " +            
        i,Toast.LENGTH_SHORT).show();
    }
}

【问题讨论】:

  • LogCat 有异常吗?
  • 没有。因为我没有发现任何异常,所以我会看到应用程序崩溃。我不会吗??
  • 我看不出这段代码有什么问题,也许问题出在其他地方。
  • 我也想不通。我看到很多关于 onITemClickHandler 的消息。这就是为什么我想写在这里寻求帮助。有趣的是;它适用于 OnItemSelectHandler :)
  • Android 不喜欢将可点击的项目放在另一个“可点击”项目(例如网格项目)中。我会拿出 ImageButton 看看是否会触发 onClickListener。如果这是问题所在,有办法让两个听众都工作。

标签: android gridview onitemclicklistener


【解决方案1】:

由于几个原因,我也遇到了同样的问题。 所以,这是我的建议:

  1. 为您的适配器扩展 BaseAdapter
  2. 在适配器的 getView 中使用 OnClickListener,而不是为 GridView 设置 OnItemClickListener
  3. 避免多次设置LayoutParams
  4. 检查position = 0,不要使用convertView,inflate new View
  5. 不仅为父 View 设置 OnClickListener,还为任何子 View(如果有)设置;
  6. 让您的所有视图都可点击。

我刚刚在 4 台设备上对其进行了测试,该解决方案按预期工作。希望,它会对你的情况有所帮助。 纠正我,如果我做错了什么。

布局代码 XML:

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="100dp"
    android:layout_height="100dp"
    android:background="#273238"
    android:clickable="true"
    android:focusable="true"
    android:focusableInTouchMode="true"
    android:padding="1dp">

<ImageView
    android:id="@+id/open_image_item_imageview"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:src="@drawable/loh"
    android:clickable="true"
    android:focusable="false"
    android:focusableInTouchMode="false"
    android:scaleType="centerCrop"/>
<TextView
    android:id="@+id/open_image_item_textview"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:clickable="true"
    android:focusable="false"
    android:focusableInTouchMode="false"
    android:layout_gravity="bottom"
    android:padding="4dp"
    android:textSize="10sp"
    android:ellipsize="start"
    android:background="#55000000"
    android:textColor="#FFFFFF"
    android:text="image name"/>

</FrameLayout>

适配器代码 Java:

 @Override
    public View getView(final int position, View convertView, ViewGroup parent) {
        View view = null;
        if(convertView != null && position != 0)
            view = convertView;
        else{
            view = LayoutInflater.from(getContext()).inflate(R.layout.open_image_item_layout, null, false);
            view.setLayoutParams(new GridView.LayoutParams(GridView.AUTO_FIT, size));
        }

        TextView textView = (TextView)view.findViewById(R.id.open_image_item_textview);
        ImageView imageView = (ImageView)view.findViewById(R.id.open_image_item_imageview);

        ...

        View.OnClickListener onClickListener = getOnClickListener(files[position]);
        view.setOnClickListener(onClickListener);
        textView.setOnClickListener(onClickListener);
        imageView.setOnClickListener(onClickListener);

        return view;
    }

【讨论】:

    【解决方案2】:

    如果您想使用ButtonImageButton,那么您需要在您的小部件的xml 代码中编写这些属性。

    android:focusable="false"
    android:focusableInTouchMode="false"
    

    它对我有用。

    但在 GridView 中,尽量避免使用这些小部件。您可以使用任何其他小部件来代替这些小部件(如 ImageView 或任何其他小部件)。

    【讨论】:

    • 奇怪的是,如果您为其设置了 onclicklistener,它仍然可以让您点击并触发按钮,但如果您点击其他任何地方,您可以根据需要点击网格项目。
    • 我必须为孩子和家长的观点都写上它。包括布局和“不可点击”视图。很奇怪,不是吗?
    • 很好的答案。非常感谢 MPG!
    【解决方案3】:

    尝试设置

        android:clickable="false"
        android:focusable="false"
    

    【讨论】:

      【解决方案4】:

      不要在网格中使用可点击的对象。在这种情况下Android无法处理GridView的点击事件。

      相反,使用一些东西来显示类似的用户界面视图。然后处理该对象的点击动作。

      不要:Button 放在GridView 中以执行一些点击操作。

      做:放置ImageView而不是ImageButton并处理ImageView的点击事件。

      【讨论】:

      • 例如,在GridView 的子类中的子类AdapterView 中:@Override public View getView(final int position, View convertView, ViewGroup parent) { ImageView imageView = new ImageView(getContext()); imageView.setOnClickListener(new OnClickListener() { @Override onClick(View v) { if (getOnItemClickListener() != null) { getOnItemClickListener().onItemClick(MyGridView.this, v, position, getItemId(position)); } return imageView; }
      • stackoverflow.com/questions/36474607/… 你能看看这个类似的问题吗?
      【解决方案5】:

      嘿家伙终于找到了解决办法...

      我们所做的是直接访问 GridView 中的 Layout,因此 onItemClickListener 发现访问项目很混乱。

      所以解决方案是在Adapter内部应用onClickListener(即通常是ArrayAdapter)

      所以我想说的是:

      public View getView(int position, View convertView, ViewGroup parent) {
      
                  //Here row is a view and we can set OnClickListener on this
          final View row;
          ViewHolder holder = null;
      
          if (convertView == null) {
              LayoutInflater inflater = ((Activity) context).getLayoutInflater();
              //Here we inflate the layout to view (linear in my case)
              row = inflater.inflate(layoutResourceId, parent, false);
              holder = new ViewHolder();
              holder.imageTitle = (TextView) row.findViewById(R.id.text);
              holder.image = (ImageView) row.findViewById(R.id.image);
              row.setTag(holder);
          } else {
              row = convertView;
              holder = (ViewHolder) row.getTag();
          }
      
          ImageItem item = data.get(position);
          holder.imageTitle.setText(item.getTitle());
          holder.image.setImageBitmap(item.getImage());
      
          //Now get the id or whatever needed
          row.setId(position);
          // Now set the onClickListener
          row.setOnClickListener(new OnClickListener() {
      
              @Override
              public void onClick(View v) {
                  // TODO Auto-generated method stub
                  Toast.makeText(context, "Clicked" + row.getId() + "!!",
                          Toast.LENGTH_SHORT).show();
              }
          });
          return row;
      }
      

      【讨论】:

        【解决方案6】:

        还要确保您的 ListAdpter 为

        返回 true

        public boolean isEnabled(int _position)

        对于您要点击的位置。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2011-07-28
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多