2009-04-10 9 views
11

J'ai des images affichées dans un GridView comme dans this tutorial. Je veux pouvoir cliquer sur une seule image et faire d'autres événements et j'ai besoin de savoir quelle image a été cliquée.Créer une image cliquable dans un GridView dans Android

Dois-je ajouter imageView.onKeyDown (keyCode, event) dans la classe ImageAdapter? Voici le code tel qu'il existe actuellement:

@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; 
} 

Comment est-ce qu'il indiquera quelle image a été cliquée? Comment créer le gestionnaire approprié?

Répondre

24

Pour un GridView vous pouvez utiliser la méthode setOnItemClickListener d'avoir un écouteur d'OnItemClickListener. Cet écouteur vous donnera une méthode que vous devez remplacer la signature

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

où vous obtenez la position de l'élément dans la grille qui a été cliqué et la vue qui se trouve dans la cellule de la grille. Est-ce ce dont vous avez besoin?

+0

Voir [la réponse de Jianhong] (http://stackoverflow.com/a/5789159/199364) pour plus de détails sur le code pour cette approche. – ToolmakerSteve

6

J'ai été en mesure d'obtenir la position de l'image cliquée en définissant la position finale et en ajoutant un écouteur onClick à l'imageView. Cela enregistre la position de l'image sur laquelle vous avez cliqué.

@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

Ce n'est pas la façon dont vous voulez faire les choses. Au lieu de cela, utilisez la méthode Alejandros. C'est beaucoup plus propre et ne vous oblige pas à changer la signature des méthodes. –

+0

Au lieu de cela, voir [La réponse de Jianhong] (http://stackoverflow.com/a/5789159/199364), qui montre le code pour utiliser gridView.setOnItemClickListener comme décrit par Alejandro. (Et mentionne un bug si vous essayez d'utiliser la solution dans cette réponse.) – ToolmakerSteve

6

J'ai essayé la méthode mentionnée ci-dessus getView (position int finale ....) s'est rendu compte que la position a été "remise à zéro" après 28 articles et la position de retour à 0 après le 28e article dans la grille.

Je soupçonne que le mot-clé final crée un problème et après l'avoir supprimé, j'ai pu obtenir les positions comme prévu. Vous trouverez ci-dessous un exemple de code dans lequel l'événement click est appelé dans l'activité qui affiche le gridview.

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)+"]"); 
    } 
}; 

}

Questions connexes