2009-04-10 15 views
11

Tengo imágenes visualizadas en un GridView como en this tutorial. Quiero poder hacer clic en una sola imagen y hacer otros eventos, y necesito saber en qué imagen se hizo clic.Crear una imagen clicable en un GridView en Android

¿Debo agregar imageView.onKeyDown (código de clave, evento) en la clase ImageAdapter? Aquí está el código tal como existe actualmente:

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    ImageView imageView; 
    if (convertView == null) { 
    // if it's not recycled, initialize some attributes 
    imageView = new ImageView(mContext); 
    imageView.setLayoutParams(new GridView.LayoutParams(85, 85)); 
    imageView.setScaleType(ImageView.ScaleType.CENTER_CROP); 
    imageView.setPadding(8, 8, 8, 8); 
    //does this need imageView.onKeyDown(keyCode, event)? 
    } 
    else { 
    imageView = (ImageView) convertView; 
    } 

    imageView.setImageResource(mThumbIds[position]); 
    return imageView; 
} 

¿Cómo se indica qué imagen se hizo clic? ¿Cómo creo el controlador adecuado?

Respuesta

24

Para un GridView se puede utilizar el método setOnItemClickListener tener un oyente OnItemClickListener. Oyente que le dará un método que debe reemplazar con la firma

onItemClick(AdapterView<?> parent, View v, int position, long id) 

donde se obtiene la posición del elemento de la cuadrícula que se ha hecho clic y la opinión de que está dentro de la celda de la cuadrícula. Es eso lo que necesita?

+0

Consulte [la respuesta de Jianhong] (http://stackoverflow.com/a/5789159/199364) para obtener un código más detallado para este enfoque. – ToolmakerSteve

6

Pude obtener la posición de la imagen cliqueada al hacer que la posición fuera definitiva y agregar un oyente onClick al imageView. Esto registra la posición de la imagen en la que se hizo clic.

@Override 
public View getView(final int position, View convertView, ViewGroup parent) { 
    ImageView imageView; 
    if (convertView == null) { 
    // if it's not recycled, initialize some attributes 
    imageView = new ImageView(mContext); 
    imageView.setLayoutParams(new GridView.LayoutParams(85, 85)); 
    imageView.setScaleType(ImageView.ScaleType.CENTER_CROP); 
    imageView.setPadding(8, 8, 8, 8); 


    imageView.setOnClickListener(new View.OnClickListener() { 

     @Override 
     public void onClick(View view) { 
     Log.d("onClick","position ["+position+"]"); 
     } 

    }); 

    } 
    else { 
    imageView = (ImageView) convertView; 
    } 

    imageView.setImageResource(mThumbIds[position]); 
    return imageView; 
} 
+3

Esta no es la manera que usted quiere hacer las cosas. En su lugar use el método de Alejandros. Es mucho más limpio y no implica cambiar la firma de los métodos. –

+0

En lugar de esto, consulte [Respuesta de Jianhong] (http://stackoverflow.com/a/5789159/199364), que muestra el código para usar gridView.setOnItemClickListener como lo describe Alejandro. (Y menciona un error si intenta utilizar la solución en esta respuesta). – ToolmakerSteve

6

probé el método mencionado getView (posición int final ...) me di cuenta de que la posición se "reinició" después de 28 elementos y la posición cuando volví a 0 después del elemento 28 en la vista de cuadrícula.

Sospecho que la palabra clave final está creando un problema y después de eliminarla pude obtener las posiciones como se esperaba.

A continuación se muestra un código de ejemplo con el evento click que se llama en la actividad que muestra la vista de cuadrícula.

public class MainActivity extends Activity { 

ArrayList<Integer> item_ids = new ArrayList<Integer>(); 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 

    item_ids = //get your item ids method 

    GridView gridview = (GridView) findViewById(R.id.grid_featured); 
    gridview.setAdapter(new ImageAdapter(this)); 
    gridview.setOnItemClickListener(itemClickListener); 

    footer = (Footer)findViewById(R.id.layoutFooter); 
    footer.setActivity(this); 
} 

private OnItemClickListener itemClickListener = new OnItemClickListener() { 
    public void onItemClick(AdapterView<?> parent, View v, int position, long id) { 
    Log.d(TAG,"Position Clicked ["+position+"] with item id ["+item_ids.get(position)+"]"); 
    } 
}; 

}

Cuestiones relacionadas