在Android GridView上未触发OnItemClickListener

时间:2011-11-18 14:00:27

标签: android gridview onitemclicklistener

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

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

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

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

顺便说一下; 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();
    }
}

6 个答案:

答案 0 :(得分:78)

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

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

请勿:Button放入GridView以执行某些点击操作。

执行:设置ImageView代替ImageButton并处理ImageView点击事件。

答案 1 :(得分:13)

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

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

它适用于我。

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

答案 2 :(得分:3)

还要确保您的ListAdpter为

返回true
  

public boolean isEnabled(int _position)

表示您要点击的位置。

答案 3 :(得分:1)

Hey guyz终于找到了解决方案......

我们正在做的是直接访问GridView中的布局,因此onItemClickListener发现访问该项目会让人感到困惑。

所以解决方案是在适配器内部应用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;
}

答案 4 :(得分:1)

尝试设置

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

答案 5 :(得分:0)

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

  1. 为适配器扩展 BaseAdapter ;
  2. 在适配器中的getView内使用 OnClickListener ,而不是为 GridView 设置 OnItemClickListener ;
  3. 避免多次设置 LayoutParams ;
  4. 检查位置是否= 0,不要使用convertView,充气新查看;
  5. 设置 OnClickListener 不仅适用于父查看,还适用于任何子查看(如果有);
  6. 点击您的所有查看
  7. 我刚刚在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;
        }