2011-12-19 11 views
7

Tengo el siguiente LinearLayout con un GridView en ella:GridView Android no hace clic en que se detecte

<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> 

Los datos GridView es suministrada por un adaptador personalizado (usando un simple 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; 
    } 
} 

Cuando se inicia la aplicación, obtiene una lista de canciones (de xml pero actualmente usa una lista ingresada manualmente) y la pasa al adaptador my y luego configura el 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); 
     } 
    } 
}); 

Cuando implementé por primera vez este código, todo funcionó bien, y estoy seguro de que no he cambiado nada. Intentaba hacer que el texto del título de la canción se desplazara en marquesina si era demasiado largo, pero no conseguí que funcionara. Durante esta fase, descubrí que el clic dejó de funcionar. Ahora eliminé (creo) todo ese código, pero aún falla.

Cuando toco/hace clic (como lo llame) no sucede nada. sin errores nada

¿Hay algún problema con mi código que pueda causar este problema?

+0

No estoy del todo seguro, así que solo lo publicaré como comentario; Elimine el atributo cliqueable de la vista de cuadrícula. Creo que esto puede anular los eventos de clic para los elementos en la vista: – Jave

+0

Intente agregar un registro para verificar si se llama a OnClickClick. En caso afirmativo, verifique el valor de songPackage. –

+0

@Jave lamentablemente no, creo que lo agregué para tratar de hacerlo funcionar, ¡pero eliminarlo todavía no funcionaba! :(¡gracias! – neildeadman

Respuesta

36

Compruebe el diseño de su artículo. Si alguna de las vistas de diseño de song_list_item está marcada como clicable, impedirá que el oyente onclick de la cuadrícula responda.

+0

Esto. Mil veces esto. Hacer clic en el diseño anulará los eventos de clic para la vista de cuadrícula. Una forma tan terrible de manejar eventos de clics. – hnilsen

+0

Tengo curiosidad acerca de cómo es que esta respuesta no tiene unos pocos millones más de votos positivos. – razielsarafan

+6

Acabo de probar y noté que la propiedad 'enfocable' también bloquea los eventos de clic para la vista de cuadrícula. – rogcg

6

Asegúrese de que el atributo clickable en GridView no anula los eventos de clic para los elementos en la vista.

+0

Esto es completamente exacto, y la misma respuesta que la 'respuesta correcta'.Los atributos seleccionables de diseño consumen completamente el evento de GridView. – hnilsen

1

Me encontré con este problema y la solución es similar a la respuesta de Dmon. Si uno de los elementos del elemento es seleccionable, también evita que se pueda hacer clic en el elemento. Entonces, si el android:textIsSelectable es verdadero.

0

Añadir esto a ur xml celular

android:descendantFocusability="blocksDescendants" 
1

si haces toda la vista de la imagen y ver el texto androide: enfocable = "false" androide: focusableInTouchMode = "false"

no habrá ser un problema en el elemento de vista de cuadrícula oyente de clic

Cuestiones relacionadas