Android Gridview and Button OnItemclick

user1594295 picture user1594295 · Aug 13, 2012 · Viewed 11.5k times · Source

Here is my buttonAdapter class that i think is accurate:

package com.example.test;

import android.content.Context; 
import android.graphics.Color; 
import android.view.View; 
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.Button; 
import android.widget.GridView;

public class ButtonAdapter extends BaseAdapter { 
    private Context mContext; 
    public String [] fName = { "File 1", "File 2", "Roflcopters"};

    // Gets the context so it can be used later 
    public ButtonAdapter(Context c) { mContext = c; }

    // Total number of things contained within the adapter 
    public int getCount () { return 8; }

    // Require for structure, not really used in my code. 
    public Object getItem (int position) {  return null; }

    // Require for structure, not really used in my code. Can be used to get the id of an item in the adapter for manual control. 
    public long getItemId (int position) { return position; }

    public View getView (int position, View convertView, ViewGroup parent){     
        Button btn;         
        if (convertView == null) {      // if it's not recycled, initialize some attributes      
            btn = new Button (mContext);
            btn.setLayoutParams (new GridView.LayoutParams (190, 190));
            btn.setPadding (1, 1, 1, 1);    
        } else {        
            btn = (Button) convertView;
        }       
      // btn.setText(filesnames[position]);   
      // filenames is an array of strings    
      //btn.setTextColor (Color.WHITE);
      //btn.setBackgroundResource (R.drawable.sample_2);  
      //btn.setBackgroundColor (Color.BLACK);     
      btn.setHighlightColor(Color.GREEN);    
      btn.setId (position);

      return btn; 
    } 
}

Here is my home class. I can't get the onItemClick to work out. What am I doing wrong here:

package com.example.test;

import android.app.Activity; 
import android.content.Intent; 
import android.os.Bundle; 
import android.view.Menu; 
import android.view.View;
import android.view.View.OnClickListener; 
import android.widget.AdapterView; 
import android.widget.AdapterView.OnItemClickListener; 
import android.widget.GridView; 
import android.widget.Toast;

public class home extends Activity implements OnItemClickListener {

    public final static String EXTRA_MESSAGE1 = "com.example.text.MESSAGE";

    public void onCreate (Bundle savedInstanceState) {    
        super.onCreate(savedInstanceState);     
        setContentView (R.layout.activity_home);    

        GridView gridview = (GridView) findViewById (R.id.gridview);
        gridview.setAdapter (new ButtonAdapter (this));     

        /*gridview.setOnItemClickListener (new OnItemClickListener () {
           public void onItemClick (AdapterView <?> parent, View v, int position, long id) {          
            Toast.makeText (home.this, "" + position, Toast.LENGTH_LONG).show ();
            Intent intent = new Intent (this, alarm.class);       
            String message = "Position:" + position;            
            intent.putExtra(EXTRA_MESSAGE1, message);        
            startActivity (intent);         
            }     
        });   
     * */    
     }

    @Override 
    public void onItemClick (AdapterView <?> parent, View v, int position, long id) {  
        Intent intent = new Intent (this, alarm.class);
        String message = "Position:" + position;        
        intent.putExtra(EXTRA_MESSAGE1, message);        
        startActivity (intent);  
    }
}

The onItemClick doesn't work and neither does the commented 'setOnItemClickListener' when it isn't commented out and 'onItemClick' is commented. What am I doing wrong?

Answer

Mohsin Naeem picture Mohsin Naeem · Aug 13, 2012

If GridView, ListView have click able controls like BUtton, then onItemClick will not fired.
You need to implement Button Click listener in your getView method of the adapter.

like

public View getView(int position, View convertView, ViewGroup parent) {
    Button btn;
    if (convertView == null) { // if it's not recycled, initialize some
                                // attributes btn = new Button (mContext);
        btn.setLayoutParams(new GridView.LayoutParams(190, 190));
        btn.setPadding(1, 1, 1, 1);
    } else {
        btn = (Button) convertView;
    } // btn.setText(filesnames[position]); // filenames is an array of
        // strings //btn.setTextColor (Color.WHITE);
    // btn.setBackgroundResource (R.drawable.sample_2);
    // btn.setBackgroundColor (Color.BLACK);
    btn.setHighlightColor(Color.GREEN);
    btn.setId(position);
    btn.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {
            // TODO Handle the click here

        }
    });
    return btn;

}