OnItemClickListener Not Triggered on Android GridView

后端 未结 6 1894
情歌与酒
情歌与酒 2020-12-03 00:50

I have a Gridview filled by an Adapter which returns LinearLayouts each contains an ImageButton and TextView.

In the adapter I am binding an onClick and onLongClick

相关标签:
6条回答
  • 2020-12-03 01:30

    Try to set

        android:clickable="false"
        android:focusable="false"
    
    0 讨论(0)
  • 2020-12-03 01:35

    Do not use clickable objects in the grid. In that case Android cannot handle the click event of GridView.

    Instead, use something to show a similar user interface view. Then handle that object's click actions.

    Don't: put Button in the GridView to perform some click actions.

    Do: put an ImageView instead of ImageButton and handle ImageView's click events.

    0 讨论(0)
  • 2020-12-03 01:37

    Hey guyz finally got a solution...

    what we were doing is directly accessing the Layout inside the GridView, so the onItemClickListener finds it confusing to access the item.

    So the solution is to apply the onClickListener inside the Adapter (i.e. normally ArrayAdapter)

    so what i m trying to say is:

    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;
    }
    
    0 讨论(0)
  • 2020-12-03 01:38

    I meet same problem too, because of several reasons. So, here's my tips:

    1. Extend BaseAdapter for your adapter;
    2. Use OnClickListener inside the getView in adapter instead setting OnItemClickListener for GridView;
    3. Avoid setting LayoutParams multiple times;
    4. Check if position = 0, don't use convertView, inflate new View;
    5. Set OnClickListener not only for parent View, but for any child View, if any;
    6. Make all your Views clickable.

    I just tested it on 4 devices, and this solution works as expected. Hope, it will help in your case. Correct me, if I made something wrong.

    Layout code 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>
    

    Adapter code 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;
        }
    
    0 讨论(0)
  • 2020-12-03 01:45

    Also make sure, that your ListAdpter returns true for

    public boolean isEnabled(int _position)

    for the position you want to click.

    0 讨论(0)
  • 2020-12-03 01:51

    If you wants to use Button or ImageButton then you need to write these attributes in your xml code of the widgets.

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

    Its works for me.

    But in GridView, Try to avoid use of these widgets. You can use any other widgets in place of these (Like ImageView or any other).

    0 讨论(0)
提交回复
热议问题