2011-05-12 31 views
5

Tengo un GridView con personalizado y Button y TextView. Definí el setOnItemClickListener pero parece que nunca se invocó, consulte las paces del código a continuación.GridView onItemClickListener nunca se invoca

gridview = (GridView) findViewById(R.id.main_gridview); 
gridview.setAdapter(new GridAdapter(this)); 

gridview.setOnItemClickListener(new OnItemClickListener() { 

    @Override 
    public void onItemClick(AdapterView<?> parent, View view, 
      int position, long id) { 
     Toast.makeText(getApplicationContext(), "gadsfadsf", 
      Toast.LENGTH_SHORT).show(); 
     Log.d("Main", "onItemClick"); 
    } 
}); 

Respuesta

3

Tuve el mismo problema. Si bien aún no entiendo por qué nunca se invoca, puedo proponer una solución alternativa.

En lugar de configurar el onClickListener en su GridView, configúrelo en el botón dentro de su GridAdapter, dentro de su método getView().

¡Eso funcionó para mí!

+0

Sí, suena como un plan, gracias. – Eugene

+1

Sí funcionó, pero por qué tocar en la vista de cuadrícula no funciona, este problema no viene con la vista de lista por qué la vista de cuadrícula – Bora

1

En lugar de establecer la onClickListener en su GridView,
puso sobre la Button sí dentro de su GridAdapter, dentro de su método getView().

¡Eso funcionó para mí!

19

La respuesta correcta es como un hack. En lugar de establecer un OnClickListener al botón acaba de asegurar, que el ButtonView y el TextView tiene la siguiente propiedad:

android:clickable="false" 
+0

fue la solución. Gracias –

+7

y también android: focusable = "false" – aalmeida

+1

simple y la mejor respuesta. – himanshu

1

que tenían el mismo problema, el evento grid.itemClickListener nunca fue lanzado.

En mi caso, tenía dos oyentes: grid.itemClickListener y otro clickListener adjunto a un Button dentro del diseño del elemento.

Después de jugar con el diseño por un tiempo, me di cuenta de que si había un widget, dentro del diseño del elemento, con focusable=true, entonces nunca se lanzó itemClickListener. El clickListener conectado al Button funcionó bien.

Quizás ese fue su caso. De todos modos, creo que esta información podría ser útil para otros usuarios que tengan el mismo problema.

1

Gracias a CodingUser

lo que hacíamos se accede directamente al diseño interior del GridView, por lo que el onItemClickListener le resulta confuso para acceder al artículo.

Así que la solución es aplicar la OnClickListener dentro del adaptador (es decir, normalmente ArrayAdapter)

así que lo que estoy tratando de decir es:

public View getView(int position, View convertView, ViewGroup parent) { 

      //Here row is a view and we can set OnClickListener on this 
    final View row; 
    ViewHolder holder = null; 

    if (convertView == null) { 
     LayoutInflater inflater = ((Activity) context).getLayoutInflater(); 
     //Here we inflate the layout to view (linear in my case) 
     row = inflater.inflate(layoutResourceId, parent, false); 
     holder = new ViewHolder(); 
     holder.imageTitle = (TextView) row.findViewById(R.id.text); 
     holder.image = (ImageView) row.findViewById(R.id.image); 
     row.setTag(holder); 
    } else { 
     row = convertView; 
     holder = (ViewHolder) row.getTag(); 
    } 

    ImageItem item = data.get(position); 
    holder.imageTitle.setText(item.getTitle()); 
    holder.image.setImageBitmap(item.getImage()); 

    //Now get the id or whatever needed 
    row.setId(position); 
    // Now set the onClickListener 
    row.setOnClickListener(new OnClickListener() { 

     @Override 
     public void onClick(View v) { 
      // TODO Auto-generated method stub 
      Toast.makeText(context, "Clicked" + row.getId() + "!!", 
        Toast.LENGTH_SHORT).show(); 
     } 
    }); 
    return row; 
} 
0

Puede establecer OnClick para vista en Adaptador de GridView. Funciona para mí

public View getView(final int position, View convertView, ViewGroup parent) { 
    ObjMenuVideo objListVideo = mListMenuVideo.get(position); 
    final ViewHolder holder; 
    if (convertView == null) { 
     holder = new ViewHolder(); 
     inflater = (LayoutInflater) mContext 
       .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     convertView = inflater.inflate(R.layout.item_video_of_kind, null); 
     holder.tv_number_views = (TextView) convertView 
     convertView.setTag(holder); 
    } else { 
     holder = (ViewHolder) convertView.getTag(); 
    } 
    holder.tv_number_views.setText(String.valueOf(objListVideo.getViews())); 
    convertView.setId(position); 
    convertView.setOnClickListener(new OnClickListener() { 

     @Override 
     public void onClick(View v) { 
      Intent menuVideoIntent = new Intent(mContext, 
        ActivityDetailVideo.class); 
      mContext.startActivity(menuVideoIntent); 
     } 
    }); 

    return convertView; 
} 
2

Podría ser que algunos elementos en su GridView roban el foco. Intente agregar estos atributos a cualquier elemento que tenga dentro de la grilla:

android:focusable="false" 
android:focusableInTouchMode="false" 
+0

Me sirve. Ahorras tiempo – Shailesh

Cuestiones relacionadas