2013-08-08 3 views
5

ho un ListView popolato con ListItems XML personalizzati, questo è il XML:Android ListView non evidenzia quando un OnClickListener è impostato

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
       android:layout_width="match_parent" 
       android:layout_height="?android:attr/listPreferredItemHeight" 
       android:padding="6dip"> 
... 
</RelativeLayout> 

ListView mostra correttamente sullo schermo e se clicco o tenere su un elemento diventa blu (sto usando tema Holo Light)

il problema nasce quando provo ad assegnare un OnClickListener alla vista, all'interno GetView nella mia attività che si estende BaseAdapter:

@Override 
public View getView(int position, @Nullable View convertView, ViewGroup parent) { 
    ... 
    convertView = InflateUtils.inflate(mContext, R.layout.list_item); 
    ... 
    convertView.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 
      Toast.makeText(mContext, "Test", 2000).show(); 
     } 
    }); 
... 
} 

dopo averlo fatto, il colore evidenziato dell'elenco non viene più mostrato, quando clicco o tengo premuto su un elemento dell'elenco il suo sfondo rimane bianco, comunque onClickListener funziona perfettamente.

Hai qualche suggerimento per ottenere il colore di evidenziazione mantenendo gli stili predefiniti di HoloLight?

risposta

3

È possibile utilizzare OnItemClickListener nello stesso ListView anziché i listener di clic separati per le visualizzazioni di articolo.

Inoltre, problema clou è già stato descritto qui: Android listview no longer highlights selection onclick

+0

Persona che ha downvoted, si preoccupa di commentare cosa c'è di sbagliato nella mia risposta? In questo modo ci avvicineremo alla verità. –

+0

non l'ho fatto, comunque ero curioso di OnItemClickListener, pensi che questo risolva il mio problema? Esistono problemi di prestazioni che utilizzano separa OnClickListener? - Ho già letto quella domanda, ma la soluzione non sta usando lo stile HoloLight, che mi è richiesto. –

+0

Bene, se i tuoi articoli sono simili, puoi usare un ascoltatore e differenziarlo per l'ID oggetto: un oggetto invece di possibilmente centinaia. Per quanto riguarda holo - puoi usare holo con la soluzione da quella risposta, usa lo sfondo di evidenziazione si chiama R.drawable.list_selector_holo_dark –

0

Aggiungere questo al layout attributi per il RelativeLayout genitore:

android:addStatesFromChildren="true" 

In alternativa, nella chiamata di codice:

convertView.setAddStatesFromChildren(true); 

In entrambi i casi, assicurarsi che i layout figlio non contengano il set di attributi android:duplicateParentState (e non chiamare setDuplicateParentState(true)), o r otterrai un'eccezione in fase di esecuzione.

+0

Questo non è lavorando per me, la parte XML. la parte programmatica che non posso testare perché il compilatore si lamenta del metodo setAddStatesFromChildren "Non esiste". Comunque, perché dovrebbe funzionare? –

0

È possibile mantenere il comportamento evidenziazione e avere più OnClickListener, se

  1. impostare la OnClickListener
  2. disattivare la OnClickListener
  3. chiamata OnClickListener da un OnItemClickListener.

Per fare ciò, aggiungere setClickable(false) al codice:

@Override 
public View getView(int position, @Nullable View convertView, ViewGroup parent) { 
    ... 
    convertView = InflateUtils.inflate(mContext, R.layout.list_item); 
    ... 
    convertView.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 
      Toast.makeText(mContext, "Test", 2000).show(); 
     } 
    }); 
    // make non-clickable again, like before setting the OnClickListener 
    convertView.setClickable(false); 
    ... 
} 

e chiamare l'ascoltatore a livello di codice, ad esempio:

public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle bundle) 
{ 
    final View view = inflater.inflate(R.layout.fragment_with_listview, container, false); 
    final ListView your_listview = (ListView) view.findViewById(R.id.your_listview); 
    // delegate to specific callbacks 
    your_listview.setOnItemClickListener(new AdapterView.OnItemClickListener() 
    { public void onItemClick(AdapterView<?> parent, View view, int position, long id) 
     { view.callOnClick(); 
     } 
    }); 
    ... 
} 

Nota il comportamento documentato di callOnClick():

Chiamare direttamente qualsiasi OnClickListener collegato. A differenza di performClick(), questo chiama solo il listener e non esegue alcuna azione di clic associata come la segnalazione di un evento di accessibilità.