Gridview OnitemClickListener non viene mai invocato
-
12-11-2019 - |
Domanda
Ho un GridView
con personalizzato View
in esso, che è un Button
e a TextView
. Ho definito il setOnItemClickListener
Ma sembra che non sia mai stato invocato, si prega di vedere le pace del codice qui sotto.
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");
}
});
Soluzione
Ho avuto lo stesso problema. Anche se non ho ancora capito perché non viene mai invocato, posso proporre una soluzione alternativa.
Invece di impostare OnClickListener sulla tua gridview, impostalo sul pulsante stesso all'interno del metodo GridaDapter, all'interno del tuo metodo getView ().
Che ha funzionato per me!
Altri suggerimenti
La risposta marcata è una specie di hack. Invece di impostare un OnClickListener sul pulsante Basta assicurarsi, che il pulsante e il TextView abbiano la seguente proprietà:
android:clickable="false"
Potrebbe essere che alcuni elementi nella tua gridview stiano rubando attenzione. Prova ad aggiungere questi attributi a tutti gli elementi che hai all'interno della griglia:
android:focusable="false"
android:focusableInTouchMode="false"
Invece di impostare il file onClickListener
sul tuo GridView
,
Impostalo su Button
se stesso dentro il tuo GridAdapter
, dentro il tuo getView()
metodo.
Che ha funzionato per me!
Ho avuto lo stesso problema, l'evento grid.itemClickListener
non è mai stato lanciato.
Nel mio caso avevo due ascoltatori: grid.itemClickListener
e un altro clickListener
attaccato a a Button
All'interno del layout dell'articolo.
Dopo aver armeggiato il layout per un po ', mi sono reso conto che se c'era un widget, all'interno del layout dell'oggetto, con focusable=true
, poi itemClickListener
non è mai stato lanciato. Il clickListener
allegato a Button
ha funzionato bene però.
Forse quello era il tuo caso. Ad ogni modo, penso che queste informazioni potrebbero essere utili per gli altri utenti che si svolgono nello stesso problema.
Grazie a CodingUser
Quello che stavamo facendo è accedere direttamente al layout all'interno della Gridview, quindi OnitemClickListener trova confuso accedere all'articolo.
Quindi la soluzione è applicare il sulicklistener all'interno dell'adattatore (cioè normalmente ArrayAdapter)
Quindi quello che sto cercando di dire è:
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;
}
Puoi impostare OnClick per la visualizzazione nell'adattatore di Gridview. Funziona per me.
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;
}