2011-11-18 15 views
26

Ho un Gridview riempito da un adattatore che restituisce LinearLayouts contenenti ciascuno un ImageButton e TextView.OnItemClickListener non attivato su Android GridView

Nell'adattatore collego un evento onClick e onLongClick a ImageButton.

Sto tentando di associare OnItemClickListener al gridview ma non so perché l'onItemclicked non sia mai stato attivato.

È la mia sesta ora senza niente.

A proposito; OnItemSelectListener funziona perfettamente sulla griglia.

Sto verificando se una parte di codice accidentalmente gestisce l'onItemClicked ma non è stato ancora catturato.

Ho bisogno di aiuto ragazzi.

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(); 
    } 
} 
+0

C'è qualche eccezione nel LogCat? –

+1

no. dal momento che non ho rilevato alcuna eccezione vorrei vedere l'applicazione si è bloccata. non dovrei ?? –

+0

Non vedo niente di sbagliato con questo codice, forse il problema è da qualche altra parte. – Caner

risposta

73

Non utilizzare oggetti cliccabili nella griglia. In quel caso Android non può gestire l'evento click di GridView.

Invece, utilizzare qualcosa per mostrare una vista simile all'interfaccia utente. Quindi gestisci le azioni di clic dell'oggetto.

No: inserire Button nello GridView per eseguire alcune azioni di clic.

Do: porre ImageView invece di ImageButton e maniglia ImageView 's eventi click.

+0

Ad esempio, in una sottoclasse 'AdapterView' all'interno di una sottoclasse di' GridView': '@Override public View getView (posizione int finale, Visualizza convertView, padre ViewGroup) { ImageView imageView = new ImageView (getContext()); imageView.setOnClickListener (nuova OnClickListener() { @Override onClick (Visualizza v) { se (getOnItemClickListener() = null) { getOnItemClickListener() onItemClick (MyGridView.this, v, posizione, getItemId (posizione))!.; } ritorno IMAGEVIEW;? } ' – EricRobertBrewer

+0

http://stackoverflow.com/questions/36474607/android-onkeylistener-with-filter-stop-onitemclicklistener-from-dpad Potete per favore guardare a questo queston simile –

3

Inoltre assicurarsi che il vostro ListAdpter restituisce true per

public boolean isEnabled (int _position)

per la posizione che si desidera fare clic su.

1

Hey guyz finalmente una soluzione ...

quello che stavamo facendo sta accedendo direttamente al layout all'interno del GridView, in modo che l'onItemClickListener resta perplesso per accedere alla voce.

Quindi la soluzione è di applicare l'onClickListener 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; 
} 
12

Se si vuole utilizzare Button o ImageButton allora avete bisogno di scrivere questi attributi nel codice XML dei widget.

android:focusable="false" 
android:focusableInTouchMode="false" 

Le sue opere per me.

Ma in GridView, cercare di evitare l'uso di questi widget. È possibile utilizzare qualsiasi altro widget al posto di questi (come ImageView o qualsiasi altro).

+0

Stranamente abbastanza, funziona e consente di toccare e attivare il pulsante se si imposta un onclicklistener per questo, ma consente di fare clic sulla voce della griglia se si tocca altrove, come desiderato. –

+0

Ho dovuto mettere quello per i bambini e per le viste genitore Compreso i layout e "non-cli ckable "visualizzazioni. Strano, non è vero? –

+0

ottima risposta. Grazie mille MPG! – richc

0

tenta di impostare

android:clickable="false" 
    android:focusable="false" 
0

mi capita di incontrare lo stesso problema troppo, a causa di diversi motivi. Quindi, ecco i miei consigli:

  1. Estendere BaseAdapter per la scheda;
  2. Usa OnClickListener all'interno del GetView adattatore invece impostazione OnItemClickListener per GridView;
  3. Evitare di impostare LayoutParams più volte;
  4. Verificare se posizione = 0, non utilizzare convertView, gonfiare nuovo Visualizza;
  5. Set OnClickListener non solo per il genitore View, ma per ogni bambino View, se del caso;
  6. Fai tutto il tuo Visualizza s cliccabile.

L'ho appena testato su 4 dispositivi e questa soluzione funziona come previsto. Spero, ti aiuterà nel tuo caso. Correggimi, se ho fatto qualcosa di sbagliato. Codice

layout XML: Codice

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

adattatore 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; 
    } 
Problemi correlati