Autore Topic: l'onItemClick non funziona al touch sull'item della listView  (Letto 826 volte)

Offline tune

  • Nuovo arrivato
  • *
  • Post: 18
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Samsung S2
  • Sistema operativo:
    Win 8
l'onItemClick non funziona al touch sull'item della listView
« il: 21 Marzo 2013, 12:17:36 CET »
0
Ciao ragazzi,
so che ci sono diversi topic riguardanti questo problema, ma poi tutti alla fine vertono sulla stessa soluzione.
spiego il mio problema: ho una ListView semplicissima con l'item e due pulsanti "Delete/Edit". vorrei che al "click" dell'item andasse al dettaglio dell'item stesso, insomma niente di trascendentale.
la struttura della riga è concettualmente questa:
...
|   data     |              [modifica][cancella]
|   oggetto della nota                            |
...
ho compreso che il problema dovrebbe stare nell'attributo focusable delle view interne alla lista,
nell'xml ho provato a settare focusable=false a tutti gli elementi della lista ma senza successo.

come posso procedere per ottenere il dettaglio della nota clickata?
avete qualche dritta?

Grazie in anticipo.

Offline lorux

  • Utente junior
  • **
  • Post: 97
  • Respect: +12
    • Google+
    • lor.catalano
    • Mostra profilo
  • Dispositivo Android:
    Galaxy S2
  • Sistema operativo:
    Windows
Re:l'onItemClick non funziona al touch sull'item della listView
« Risposta #1 il: 21 Marzo 2013, 13:04:21 CET »
+1
se non sbaglio ti avevo risposto in un altro post per la questione dei bottoni no?
lì aggiungevi il listener al button,e questo va bene per il click sul button,se vuoi poter cliccare sulla riga dovresti aggiungere un clicklistener anche alla view della riga( la convertView del getView())

Offline tune

  • Nuovo arrivato
  • *
  • Post: 18
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Samsung S2
  • Sistema operativo:
    Win 8
Re:l'onItemClick non funziona al touch sull'item della listView
« Risposta #2 il: 21 Marzo 2013, 15:02:39 CET »
0
hai ragione, mi sono lasciato ingannare dall'OnItemClickListener.
non pensando che avrei potuto estendere tranquillamente la logica dei listeners dei pulsanti anche al "contenitore"
dei pulsanti stessi, ovvero la "row".

di seguito posto il mio adapter, aggiornato con il listener relativo al problema di queto topic:
Codice (Java): [Seleziona]
package com.prendonota;
...

public class ListaNotaAdapter extends ArrayAdapter<Nota> implements OnClickListener{
       
        public Nota nota;
        public final Activity activity;
        private View delete;
        private View edit;
       
        public ListaNotaAdapter(Context context, int textViewResourceId, List<Nota> objects) {
                super(context, textViewResourceId, objects);
                activity = (Activity)context;
        }              
       
       
       
        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
               
                LayoutInflater inflater = (LayoutInflater)getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
                convertView = inflater.inflate(R.layout.row, null );
               
                TextView data           = (TextView)convertView.findViewById(R.id.item_data);
                TextView oggetto        = (TextView)convertView.findViewById(R.id.item_oggetto);
                delete                          = (ImageButton)convertView.findViewById(R.id.button_row_delete);
                edit                            = (ImageButton)convertView.findViewById(R.id.button_row_edit);
               
                nota = getItem(position);
               
                //**** in fine associo agli appositi oggetti "TextView" i rispettivi valori
                data.setText(nota.get_dataInserimentoModifica());
                oggetto.setText( position + " - " + nota.get_id() + " - " + nota.get_oggetto());

                //*** assegnazione dei listeners ai rispettivi pulsanti e row
                delete.setOnClickListener(this);
                edit.setOnClickListener(this);
                convertView.setOnClickListener(this);
               
                //*** assegnazione dell'informazione della position [implementare getParent()]
                delete.setTag(position);
                edit.setTag(position);
                convertView.setTag(position);
               
                return convertView;
        }

       
                @Override
                public void onClick(View v) {

                        int position = (Integer)v.getTag();
                        //*** recupero l'oggetto nota presente nell'item di turno
                        Nota nota = getItem(position);
                       
                        switch (v.getId()) {
                                case R.id.button_row_delete:
                                        NotaCrud crud = new NotaCrud(getContext());
                                        Log.i(MainActivity.class.getName(),
                                                        "Delete Nota, ID:" + nota.get_id() + " position on list(" + position +")" );
                                        crud.deleteNota(nota.get_id());
                                        this.remove(nota);
                                        break;
       
                                case R.id.button_row_edit:
                                        Log.i(MainActivity.class.getName(),
                                                        "Edit Nota, ID:" + nota.get_id() + " position on list(" + position +")" );                                     
                                        Intent intent = new Intent(activity, EditNoteActivity.class);
                                        //*** oggetto Nota "Parcel-izzato"
                                        intent.putExtra(Constants.PN_EDIT_NOTE_OBJ, nota);
                                        activity.startActivity(intent);
                                        break;
                                       
                                default:
                                        Log.i(MainActivity.class.getName(),
                                                        "Detail Nota, ID:" + nota.get_id() + " position on list(" + position +")" );
                                        Log.i(this.getClass().toString(), "ListaNotaAdapter: +++ log +++");
                                        Toast.makeText( getContext(), "ListaNotaAdapter", Toast.LENGTH_SHORT ).show();
                                        break;
                        }
                }
}

tra l'altro devo apire bene come evitare di dichiarare 3oggetti, colo per non perdere l'informazione della positio, parlo del "getParent()"...
ora mi informo, nel frattempo grazie ancora.

Offline lorux

  • Utente junior
  • **
  • Post: 97
  • Respect: +12
    • Google+
    • lor.catalano
    • Mostra profilo
  • Dispositivo Android:
    Galaxy S2
  • Sistema operativo:
    Windows
Re:l'onItemClick non funziona al touch sull'item della listView
« Risposta #3 il: 21 Marzo 2013, 15:24:33 CET »
0
beh volendo metti il tag con la position solo sulla row,
se poi nell'onclick stai cliccando uno dei due bottoni,che sono figli diretti della row,usi il (View)v.getParent()).getTag() per prendere la row,mentre se stai cliccando sulla row usi direttamente v.getTag()