31

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

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

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

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

顺便一提; OnItemSelectListener 在网格上完美运行。

我正在检查某些代码是否意外处理了 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();
    }
}
4

6 回答 6

83

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

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

不要:放入ButtonGridView执行一些点击操作。

做:放置一个ImageView代替ImageButton并处理ImageView的点击事件。

于 2011-11-21T07:33:56.710 回答
17

如果您想使用Button,或者ImageButton您需要在小部件的 xml 代码中编写这些属性。

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

它对我有用。

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

于 2014-11-21T08:26:25.347 回答
4

还要确保您的 ListAdpter 返回 true

公共布尔 isEnabled(int _position)

对于您要单击的位置。

于 2012-12-28T20:52:19.467 回答
2

嘿家伙终于有一个解决方案......

我们所做的是直接访问 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;
}
于 2014-01-22T11:28:35.130 回答
1

尝试设置

    android:clickable="false"
    android:focusable="false"
于 2016-04-22T09:56:45.810 回答
1

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

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

我刚刚在 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;
    }
于 2017-11-05T21:04:49.423 回答