2009-04-10 10 views
11

Ich habe Bilder in einem GridView wie in this tutorial angezeigt. Ich möchte in der Lage sein, auf ein einzelnes Bild zu klicken und andere Ereignisse zu machen, und ich muss wissen, welches Bild geklickt wurde.Erstellen Sie ein anklickbares Bild in einer GridView in Android

Muss ich imageView.onKeyDown (keyCode, event) in der ImageAdapter-Klasse hinzufügen? Hier ist der Code, wie er derzeit existiert:

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

Wie wird es angezeigt, welches Bild geklickt wurde? Wie erstelle ich den richtigen Handler?

Antwort

24

Für ein Gridview können Sie die setOnItemClickListener Methode verwenden, um einen OnItemClickListener Zuhörer zu haben. Das Zuhörer werden Ihnen eine Methode, die Sie mit der Signatur überschreiben muss

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

, wo Sie die Position des Elements im Netz erhalten, die angeklickt wurde und die Ansicht, dass in der Zelle des Gitters ist. Ist das was du brauchst?

+0

Siehe [Jianhongs Antwort] (http://stackoverflow.com/a/5789159/199364) für detaillierteren Code für diesen Ansatz. – ToolmakerSteve

6

Ich konnte die Position des angeklickten Bildes erhalten, indem ich die Position final mache und einen onClick Listener zum imageView hinzufüge. Dies protokolliert die Position des Bildes, auf das geklickt wurde.

@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

Dies ist nicht die Art und Weise Sie die Dinge tun wollen. Verwenden Sie stattdessen die Alejandros-Methode. Es ist viel sauberer und beinhaltet nicht das Ändern der Methodensignatur. –

+0

Stattdessen sehen Sie [Jianhongs Antwort] (http://stackoverflow.com/a/5789159/199364), die Code für die Verwendung von gridView.setOnItemClickListener wie von Alejandro beschrieben zeigt. (Und erwähnt einen Fehler, wenn versucht wird, die Lösung in dieser Antwort zu verwenden.) – ToolmakerSteve

6

Ich versuchte die oben erwähnte Methode getView (endgültige int Position...) erkannte, dass die Position nach 28 Elementen und die Position zurück nach 0 nach dem 28. Element in der Gridview "zurückgesetzt" wurde.

Ich vermutete, dass das endgültige Schlüsselwort ein Problem erzeugt und nachdem ich es entfernt hatte, konnte ich die Positionen wie erwartet bekommen.

Im Folgenden finden Sie einen Beispielcode, bei dem das click-Ereignis in der Aktivität aufgerufen wird, die die Gridview anzeigt.

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

}

Verwandte Themen