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?
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
Provare ad aggiungere un registro per verificare se viene chiamato onItemClick. Se sì, controlla il valore di songPackage. –
@Jave purtroppo no, credo di averlo aggiunto per cercare di farlo funzionare, ma rimuovere ancora non ha funzionato! :(grazie comunque! – neildeadman