2011-12-19 20 views
7

Ho la seguente LinearLayout con una GridView in esso:Android GridView non cliccare essere rilevato

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:orientation="vertical" > 

    <GridView 
     android:id="@+id/songs_grid" 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent" 
     android:clickable="true" 
     android:columnWidth="250dp" 
     android:gravity="center" 
     android:horizontalSpacing="10dp" 
     android:numColumns="auto_fit" 
     android:verticalSpacing="10dp" /> 

</LinearLayout> 

I dati GridView è fornita da un adattatore personalizzato (utilizzando un semplice ViewHolder):

public class SongsAdapter extends BaseAdapter { 

    private Context context; 

    private LayoutInflater mInflater; 

    private ArrayList<Song> songList; 

    public SongsAdapter(Context context, ArrayList<Song> songList) 
    { 
     this.context = context; 

     this.songList = songList; 

     mInflater = LayoutInflater.from(this.context); 
    } 

    @Override 
    public int getCount() 
    { 
     return songList.size(); 
    } 

    public Object getItem(int position) 
    { 
     return songList.get(position); 
    } 

    public long getItemId(int position) 
    { 
     return position; 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) 
    { 
     SongViewHolder viewHolder; 

     if (convertView == null) 
     { 
      convertView = mInflater.inflate(R.layout.song_list_item, null); 

      viewHolder = new SongViewHolder(); 

      //Get Views from Layout Template 
      viewHolder.AlbumArt = (ImageView)convertView.findViewById(R.id.albumart); 
      viewHolder.Title = (TextView)convertView.findViewById(R.id.title); 
      viewHolder.Artist = (TextView)convertView.findViewById(R.id.artist); 
     } 
     else 
     { 
      viewHolder = (SongViewHolder) convertView.getTag(); 
     } 

     Song song = songList.get(position); 

     Bitmap bitmap = song.getAlbumArt(); 
     Bitmap missing = BitmapFactory.decodeResource(context.getResources(), R.drawable.albumart_missing); 

     Bitmap albumArt = bitmap == null ? missing : bitmap; 

     viewHolder.AlbumArt.setImageBitmap(albumArt); 
     viewHolder.Title.setText(song.getTitle()); 
     viewHolder.Artist.setText(song.getArtist()); 

     convertView.setTag(viewHolder); 

     return convertView; 
    } 
} 

All'avvio dell'app viene visualizzato un elenco di brani (da xml ma attualmente viene utilizzato un elenco inserito manualmente) e lo passa all'adattatore e quindi imposta OnItemClickListener:

GridView gridView = (GridView) findViewById(R.id.songs_grid); 
gridView.setAdapter(new SongsAdapter(this, fk.getSongList())); 

gridView.setOnItemClickListener(new OnItemClickListener() 
{ 
    @Override 
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) 
    { 
     LinearLayout layout = (LinearLayout)view; 

     TextView songTitle = (TextView)layout.findViewById(R.id.song_title); 

     Song song = fk.getSong((String) songTitle.getText()); 

     if(song != null) 
     { 
      Intent play = new Intent(getBaseContext(), Play.class); 
      startActivity(play); 
     } 
    } 
}); 

Quando ho implementato questo codice, tutto ha funzionato e sono sicuro di non aver cambiato nulla. Stavo cercando di far scorrere il testo per lo scorrimento del titolo del brano in un tendone se era troppo lungo, ma non riuscivo a farlo funzionare. Durante questa fase ho scoperto che il clic ha smesso di funzionare. Ora ho rimosso (credo) tutto quel codice, ma non riesce ancora.

Quando tocco/clic (qualsiasi cosa tu lo chiami) non succede nulla. nessun errore, niente.

C'è qualcosa di sbagliato nel mio codice che potrebbe causare questo problema?

+0

Non ne sono del tutto sicuro, quindi mi limiterò a postare come commento; Rimuovi l'attributo cliccabile da gridview. Penso che questo potrebbe ignorare gli eventi di clic per gli elementi nella vista. – Jave

+0

Provare ad aggiungere un registro per verificare se viene chiamato onItemClick. Se sì, controlla il valore di songPackage. –

+0

@Jave purtroppo no, credo di averlo aggiunto per cercare di farlo funzionare, ma rimuovere ancora non ha funzionato! :(grazie comunque! – neildeadman

risposta

36

Controlla il layout dell'articolo. Se una qualsiasi delle viste del layout song_list_item è contrassegnata come selezionabile, bloccherà il listener onclick della griglia dalla risposta.

+0

Questo. Mille volte questo. Cliccando sul layout si annullano gli eventi click per il gridview. Un modo così terribile di gestire gli eventi click. – hnilsen

+0

Sono curioso di sapere come mai questa risposta non ha qualche milione di voti in più. – razielsarafan

+6

Ho appena testato e notato che la proprietà 'focusable' blocca anche gli eventi click per il gridview. – rogcg

6

Assicurarsi che l'attributo clickable in GridView non sovrascriva gli eventi di clic per gli elementi nella vista.

+0

Ciò è completamente accurato e la stessa risposta della "risposta corretta".Gli attributi cliccabili del layout mangiano completamente l'evento da GridView. – hnilsen

1

Mi sono imbattuto in questo problema e la soluzione è simile alla risposta di dmon. Se uno dei figli dell'elemento è selezionabile, impedisce anche che l'elemento sia selezionabile. Quindi se il android:textIsSelectable è vero.

0

Aggiungi questo al ur xml cella

android:descendantFocusability="blocksDescendants" 
1

se fai tutto la vista di immagine e testo vista Android: attivabile = "false" android: focusableInTouchMode = "false"

non ci essere qualsiasi problema nel listener di click di articolo gridview

Problemi correlati