J'ai un Gridview rempli par un adaptateur qui renvoie LinearLayouts, chacun contenant un ImageButton et un TextView.
Dans l'adaptateur, je lie un événement onClick et onLongClick à ImageButton.
J'essaie de lier OnItemClickListener au gridview mais je ne sais pas pourquoi le onItemclicked ne s'est jamais allumé.
C'est ma 6ème heure sans rien.
Au fait, OnItemSelectListener fonctionne parfaitement sur la grille.
Je vérifie si un morceau de code gère accidentellement le onItemClicked mais ne peut pas encore l'attraper.
J'ai besoin d'aide les gars.
gridView = (GridView) layoutInflater.inflate(R.layout.gridview, null);
gridView.setOnItemClickListener(new ItemClickListener());
.
.
.
//inner handler class
class ItemClickListener implements AdapterView.OnItemClickListener {
@Override
public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
Toast.makeText(mainActivity.getApplicationContext(),view + " clicked at pos " +
i,Toast.LENGTH_SHORT).show();
}
}
N'utilisez pas d'objets cliquables dans la grille. Dans ce cas, Android ne peut pas gérer l'événement de clic de GridView
.
A la place, utilisez quelque chose pour afficher une vue similaire de l'interface utilisateur. Puis gérez les actions de clic de cet objet.
Ne pas: mettre Button
dans la GridView
pour effectuer certaines actions de clic.
Faites: mettez une ImageView
au lieu de ImageButton
et gérez les événements de clic de ImageView
.
Si vous souhaitez utiliser Button
ou ImageButton
, vous devez écrire ces attributs dans votre code xml des widgets.
Android:focusable="false"
Android:focusableInTouchMode="false"
Cela fonctionne pour moi.
Mais dans GridView, essayez d'éviter l'utilisation de ces widgets. Vous pouvez utiliser n'importe quel autre widget à la place de celui-ci (comme ImageView ou tout autre).
Assurez-vous également que votre ListAdpter renvoie true pour
booléen public isEnabled (int _position)
pour la position que vous voulez cliquer.
Essayez de définir
Android:clickable="false"
Android:focusable="false"
Hey guyz a finalement trouvé une solution ...
ce que nous faisions est d'accéder directement à la mise en page à l'intérieur du GridView, de sorte que onItemClickListener trouve qu'il est compliqué d'accéder à l'élément.
La solution consiste donc à appliquer le onClickListener à l’intérieur de l’adaptateur (normalement, ArrayAdapter).
donc, ce que j'essaie de dire, c'est:
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;
}
Je rencontre le même problème aussi, pour plusieurs raisons ... Voici donc mes conseils:
Je viens de le tester sur 4 appareils et cette solution fonctionne comme prévu. J'espère que cela vous aidera dans votre cas… __. Corrigez-moi si je fais quelque chose de mal.
Code de mise en page XML:
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout
xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:layout_width="100dp"
Android:layout_height="100dp"
Android:background="#273238"
Android:clickable="true"
Android:focusable="true"
Android:focusableInTouchMode="true"
Android:padding="1dp">
<ImageView
Android:id="@+id/open_image_item_imageview"
Android:layout_width="match_parent"
Android:layout_height="match_parent"
Android:src="@drawable/loh"
Android:clickable="true"
Android:focusable="false"
Android:focusableInTouchMode="false"
Android:scaleType="centerCrop"/>
<TextView
Android:id="@+id/open_image_item_textview"
Android:layout_width="match_parent"
Android:layout_height="wrap_content"
Android:clickable="true"
Android:focusable="false"
Android:focusableInTouchMode="false"
Android:layout_gravity="bottom"
Android:padding="4dp"
Android:textSize="10sp"
Android:ellipsize="start"
Android:background="#55000000"
Android:textColor="#FFFFFF"
Android:text="image name"/>
</FrameLayout>
Code adaptateur Java:
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
View view = null;
if(convertView != null && position != 0)
view = convertView;
else{
view = LayoutInflater.from(getContext()).inflate(R.layout.open_image_item_layout, null, false);
view.setLayoutParams(new GridView.LayoutParams(GridView.AUTO_FIT, size));
}
TextView textView = (TextView)view.findViewById(R.id.open_image_item_textview);
ImageView imageView = (ImageView)view.findViewById(R.id.open_image_item_imageview);
...
View.OnClickListener onClickListener = getOnClickListener(files[position]);
view.setOnClickListener(onClickListener);
textView.setOnClickListener(onClickListener);
imageView.setOnClickListener(onClickListener);
return view;
}