Search code examples
androidandroid-gridviewandroid-galleryandroid-bitmap

Android Gallery Grid On Selected not working


I have a code located already here, but now I have an other problem. As you can see in main activity, there is a onItemClick Event for the image shown in the gridview but, the problem is that there is noting happening when clicking on the picture.

MAIN_ACTIVITY

package com.javatechig.gridview;

import java.io.File;
import java.util.ArrayList;

import android.app.Activity;
import android.content.res.TypedArray;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Bundle;
import android.os.Environment;
import android.util.Log;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.GridView;
import android.widget.Toast;

/**
 * 
 * @author javatechig {@link http://javatechig.com}
 * 
 */
public class MainActivity extends Activity {
    private GridView gridView;
    private GridViewAdapter customGridAdapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main_delta);

        gridView = (GridView) findViewById(R.id.gridView);
        customGridAdapter = new GridViewAdapter(this, R.layout.row_grid, getData());
        gridView.setColumnWidth(400);
        gridView.setPadding(8, 8, 8, 8);
        gridView.setAdapter(customGridAdapter);

        gridView.setOnItemClickListener(new OnItemClickListener() {
            public void onItemClick(AdapterView<?> parent, View v,
                    int position, long id) {
                Toast.makeText(MainActivity.this, position + "#Selected",
                        Toast.LENGTH_SHORT).show();
                Log.w("click", "click");
            }

        }); 



    }





    private ArrayList<ImageItem> getData() {
        final ArrayList imageItems = new ArrayList();

        String stringpath = Environment.getExternalStorageDirectory().toString()+"/Pictures/Hello Camera";
        File path=new File(stringpath);
        File[] imageFiles = path.listFiles();
        for (int i = 0; i < imageFiles.length; i++) {
          //  Bitmap bitmap = BitmapFactory.decodeFile(imageFiles[i].getAbsolutePath());
          //  imageItems.add(new ImageItem(bitmap, "Image#" + i));

            final BitmapFactory.Options options = new BitmapFactory.Options();
            options.inSampleSize = 4;

            Bitmap bitmap = BitmapFactory.decodeFile(imageFiles[i].getAbsolutePath(),options);
            imageItems.add(new ImageItem(bitmap, "Image#" + i));

        }

        return imageItems;}

}

GridViewAdapter

package com.javatechig.gridview;

import java.util.ArrayList;

import android.app.Activity;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.CheckBox;
import android.widget.ImageView;
import android.widget.TextView;

/**
 * 
 * @author javatechig {@link http://javatechig.com}
 * 
 */
public class GridViewAdapter extends ArrayAdapter<ImageItem> {
    private Context context;
    private int layoutResourceId;
    private ArrayList<ImageItem> data = new ArrayList<ImageItem>();

    public GridViewAdapter(Context context, int layoutResourceId,
            ArrayList<ImageItem> data) {
        super(context, layoutResourceId, data);
        this.layoutResourceId = layoutResourceId;
        this.context = context;
        this.data = data;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        View row = convertView;
        ViewHolder holder = null;

        if (row == null) {
            LayoutInflater inflater = ((Activity) context).getLayoutInflater();
            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);
            holder.checkbox = (CheckBox) row.findViewById(R.id.checkBox1);
            row.setTag(holder);
        } else {
            holder = (ViewHolder) row.getTag();
        }

        ImageItem item = data.get(position);
        holder.imageTitle.setText(item.getTitle());
        holder.image.setImageBitmap(item.getImage());
        holder.checkbox.setChecked(false);

        return row;
    }

    static class ViewHolder {
        TextView imageTitle;
        ImageView image;
        CheckBox checkbox;
    }
}

ImageItem

package com.javatechig.gridview;

import android.graphics.Bitmap;

/**
 * @author javatechig {@link http://javatechig.com}
 * 
 */
public class ImageItem {
    private Bitmap image;
    private String title;

    public ImageItem(Bitmap image, String title) {
        super();
        this.image = image;
        this.title = title;
    }

    public Bitmap getImage() {
        return image;
    }

    public void setImage(Bitmap image) {
        this.image = image;
    }

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }
}

**

  • XML

**

rowgrid

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_marginTop="5dp"
    android:orientation="vertical"
    android:padding="5dp" 
    android:clickable="true"
    android:background="@drawable/grid_color_selector"
    android:descendantFocusability="blocksDescendants">

    <ImageView
        android:id="@+id/image"
        android:layout_width="200dp"
        android:layout_height="200dp"
        android:scaleType="center" >

    </ImageView>

    <CheckBox
        android:id="@+id/checkBox1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="CheckBox"
         />

    <TextView
        android:id="@+id/text"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="5dp"
        android:gravity="center"
        android:textSize="12sp"
         >
    </TextView>

</LinearLayout>

activity_main_delta

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="#f0f0f0"
    tools:context=".MainActivity"
    android:descendantFocusability="blocksDescendants" >

    <GridView
        android:id="@+id/gridView"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_margin="5dp"
        android:clickable="true"
        android:columnWidth="100dp"
        android:drawSelectorOnTop="true"
        android:gravity="center"
        android:numColumns="auto_fit"
        android:stretchMode="columnWidth"
        android:verticalSpacing="5dp" >

    </GridView>

</RelativeLayout>

How can I fix it?

Thanks!


Solution

  • Please remove android:clickable attribute from your rowgrid LinearLayout. This is capturing the event before the GridView gets it. So just bind all onClick and onLongClick to your GridView's onItemClick and onItemLongClick Listeners. Good luck.