Autore Topic: Gestione onItemLongClick su Adapter personalizzato  (Letto 1465 volte)

Offline Ohmnibus

  • Utente senior
  • ****
  • Post: 623
  • Respect: +136
    • Google+
    • @ohmnibus
    • Mostra profilo
    • Lords of Knowledge GdR
  • Dispositivo Android:
    Samsung Galaxy Nexus
  • Play Store ID:
    Ohmnibus
  • Sistema operativo:
    Windows 7 x64
Gestione onItemLongClick su Adapter personalizzato
« il: 05 Ottobre 2010, 17:07:50 CEST »
0
Salve,

ho una ListView i cui elementi sono gestiti da un mio adapter. Ogni elemento della lista è composto da una View che contiene a sua volta vari elementi (testo, immagini e bottoni).

L'evento "longclick" sugli elementi della lista viene correttamente sollevato, ma lo sfondo non assume la tipica colorazione transiente standard delle ListView in questa situazione (dall'arancione al giallo). Ho cercato un po' in rete ma non ho trovato informazioni chiare a proposito.

Sto sbagliando qualcosa o è necessario esplicitare in qualche modo questo comportamento?

Grazie.

P.S.: Perdonate se non posto codice, ma attualmente sono fuori casa e non ho nulla sotto mano :P
Ohmnibus
Le mie app su Play Store

È stata trovata una soluzione al tuo problema? Evidenzia il post più utile premendo . È un ottimo modo per ringraziare chi ti ha aiutato.

Offline Qlimax

  • Moderatore globale
  • Utente senior
  • *****
  • Post: 757
  • Respect: +202
    • Google+
    • _Qlimax
    • Mostra profilo
    • www.egsolutions.ch
  • Dispositivo Android:
    Galaxy Nexus - Nexus One - Wildfire - Magic
  • Play Store ID:
    egsolutions.ch
  • Sistema operativo:
    Ubuntu 12.04, Windows 7
Re:Gestione onItemLongClick su Adapter personalizzato
« Risposta #1 il: 05 Ottobre 2010, 22:41:18 CEST »
0
dovresti postare l xml del tuo layout... così a vuoto è dura...

Offline Ohmnibus

  • Utente senior
  • ****
  • Post: 623
  • Respect: +136
    • Google+
    • @ohmnibus
    • Mostra profilo
    • Lords of Knowledge GdR
  • Dispositivo Android:
    Samsung Galaxy Nexus
  • Play Store ID:
    Ohmnibus
  • Sistema operativo:
    Windows 7 x64
Re:Gestione onItemLongClick su Adapter personalizzato
« Risposta #2 il: 06 Ottobre 2010, 20:42:43 CEST »
0

Ho usato la snippet Clickable Listview Item presa da Android Snippets. Io ho fatto modifiche minori che comunque non sono la causa del problema, dato che anche in quella l'effetto sul colore di bg non funziona.
Ohmnibus
Le mie app su Play Store

È stata trovata una soluzione al tuo problema? Evidenzia il post più utile premendo . È un ottimo modo per ringraziare chi ti ha aiutato.

Offline MMarko

  • Utente junior
  • **
  • Post: 128
  • Respect: +5
    • MarcoMatarazzi
    • Mostra profilo
    • La Rocchetta Bed And Breakfast
  • Dispositivo Android:
    HTC Legend
  • Play Store ID:
    MarcoMatarazzi
Re:Gestione onItemLongClick su Adapter personalizzato
« Risposta #3 il: 06 Ottobre 2010, 22:27:43 CEST »
0
Non so se ho capito il problema, ma credo di aver avuto un comportamento simile, ho inserito la stringa
android:cacheColorHint="#00000000" nell'XML della mia ListView
Codice (XML): [Seleziona]
<ListView
        android:id="@+id/lista"
        android:cacheColorHint="#00000000"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent">
</ListView>

Spero sia quello che cerchi :)


Offline Ohmnibus

  • Utente senior
  • ****
  • Post: 623
  • Respect: +136
    • Google+
    • @ohmnibus
    • Mostra profilo
    • Lords of Knowledge GdR
  • Dispositivo Android:
    Samsung Galaxy Nexus
  • Play Store ID:
    Ohmnibus
  • Sistema operativo:
    Windows 7 x64
Re:Gestione onItemLongClick su Adapter personalizzato
« Risposta #4 il: 07 Ottobre 2010, 00:16:27 CEST »
0
Grazie dell'intervento, MMarko, ma non mi è stato di grande aiuto.
Anzitutto ho una ListActivity senza layout, quindi non ho un XML dove aggiungere cacheColorHint. Ho provato con myListView.setCacheColorHint, ma non ho ottenuto nessun cambiamento.

Dato che a volte, me ne rendo conto, sono criptico, spiego meglio il mio problema.

Prendiamo ad esempio l'elenco dei contatti standard. Se teniamo premuto a lungo su un contatto, lo sfondo diventa arancione, poi subito sfuma al bianco ed a questo punto si verifica un evento "LongClick" (aprendo un menù contestuale).

Nel mio ListView, che è una versione leggermente modificata di questo, l'evengo LongClick su un elemento viene correttamente sollevato, ma lo sfondo non si colora come descritto sopra. Funzionalmente è una sciocchezza, ma la colorazione dall'arancione al bianco è un meccanismo appositamente studiato per far capire all'utente che il LongClick è gestito e che quindi tenendo premuto sul tasto succede qualcosa.

Nessuno ha mai incontrato un problema simile? Sapete suggerirmi come risolverlo?

Grazie in anticipo.
Ohmnibus
Le mie app su Play Store

È stata trovata una soluzione al tuo problema? Evidenzia il post più utile premendo . È un ottimo modo per ringraziare chi ti ha aiutato.

Offline Ricky`

  • Amministratore
  • Utente storico
  • *****
  • Post: 3489
  • Respect: +506
    • Github
    • Google+
    • rciovati
    • Mostra profilo
Re:Gestione onItemLongClick su Adapter personalizzato
« Risposta #5 il: 07 Ottobre 2010, 01:12:52 CEST »
0
Hai impostato un listSelector personalizzato per questa ListView? Nel caso non l'hai fatto, stai sviluppando su un dispositivo con framework personalizzato (tipo htc sense) o su android standard?

Offline Ohmnibus

  • Utente senior
  • ****
  • Post: 623
  • Respect: +136
    • Google+
    • @ohmnibus
    • Mostra profilo
    • Lords of Knowledge GdR
  • Dispositivo Android:
    Samsung Galaxy Nexus
  • Play Store ID:
    Ohmnibus
  • Sistema operativo:
    Windows 7 x64
Re:Gestione onItemLongClick su Adapter personalizzato
« Risposta #6 il: 07 Ottobre 2010, 01:22:42 CEST »
0
Non sapendo cos'e' un listSelector, direi proprio di non averlo impostato :-P

Per lo sviluppo utilizzo un emulatore generico. Ho testato l'app su Nexus One ed il comportamento è identico.

Credo che il problema derivi dal fatto che il LongClickListener deve essere associato all'adapter e non ad una singola View della ListView, come avviene in questa personalizzazione. Credo sia necessario gestire l'evento ItemLongClickListener, ma nel BaseAdapter (dal quale deriva l'adapter custom) questo handler non c'è...
Ohmnibus
Le mie app su Play Store

È stata trovata una soluzione al tuo problema? Evidenzia il post più utile premendo . È un ottimo modo per ringraziare chi ti ha aiutato.

Offline Ricky`

  • Amministratore
  • Utente storico
  • *****
  • Post: 3489
  • Respect: +506
    • Github
    • Google+
    • rciovati
    • Mostra profilo
Re:Gestione onItemLongClick su Adapter personalizzato
« Risposta #7 il: 07 Ottobre 2010, 01:40:35 CEST »
0
Ho visto solo ora il codice che stai cercando di utilizzare e la prima domanda che mi è venuta in mente è... ma perchè????
Cos'è che devi fare in questa listview? Non ti basta ereditare un semplice ArrayAdapter?

[medio] ListView con layout personalizzato tramite un custom ArrayAdapter - Android Developers Italia

Offline Ohmnibus

  • Utente senior
  • ****
  • Post: 623
  • Respect: +136
    • Google+
    • @ohmnibus
    • Mostra profilo
    • Lords of Knowledge GdR
  • Dispositivo Android:
    Samsung Galaxy Nexus
  • Play Store ID:
    Ohmnibus
  • Sistema operativo:
    Windows 7 x64
Re:Gestione onItemLongClick su Adapter personalizzato
« Risposta #8 il: 07 Ottobre 2010, 02:18:47 CEST »
0
Ho usato quello snippet per due ragioni. La prima è che sono alle prime armi ed è stata la prima soluzione decente che ho trovato per gestire elementi di ListView complessi. La seconda è perché trovavo molto interessante l'utilizzo dell'Holder Pattern, che riduce il numero di findViewById.
Appena ho tempo provo con l'ArrayAdapter. Intanto ringrazio, poi farò sapere com'è andata.
Ohmnibus
Le mie app su Play Store

È stata trovata una soluzione al tuo problema? Evidenzia il post più utile premendo . È un ottimo modo per ringraziare chi ti ha aiutato.

Offline Ohmnibus

  • Utente senior
  • ****
  • Post: 623
  • Respect: +136
    • Google+
    • @ohmnibus
    • Mostra profilo
    • Lords of Knowledge GdR
  • Dispositivo Android:
    Samsung Galaxy Nexus
  • Play Store ID:
    Ohmnibus
  • Sistema operativo:
    Windows 7 x64
Re:Gestione onItemLongClick su Adapter personalizzato
« Risposta #9 il: 08 Ottobre 2010, 00:15:27 CEST »
0
Ho provato con l'ArrayAdapter ma continua a non funzionare. Ho implementato pari pari l'esempio presentato nel tutorial (a proposito: complimenti per il tutorial!) ed ho aggiunto la gestione al longclick.

In pratica, in fondo a PersonAdapter.getView ho aggiunto:

Codice (Java): [Seleziona]
            convertView.setOnLongClickListener(new OnLongClickListener() {
               
                public boolean onLongClick(View v) {
                    Toast.makeText(PersonAdapter.this.getContext(), "Test", Toast.LENGTH_SHORT).show();
                    return false;
                }
            });

            return convertView;

Il risultato è il solito: il longclick viene gestito, ma il colore di sfondo non transisce dall'arancione al bianco.
Ohmnibus
Le mie app su Play Store

È stata trovata una soluzione al tuo problema? Evidenzia il post più utile premendo . È un ottimo modo per ringraziare chi ti ha aiutato.

Offline Ohmnibus

  • Utente senior
  • ****
  • Post: 623
  • Respect: +136
    • Google+
    • @ohmnibus
    • Mostra profilo
    • Lords of Knowledge GdR
  • Dispositivo Android:
    Samsung Galaxy Nexus
  • Play Store ID:
    Ohmnibus
  • Sistema operativo:
    Windows 7 x64
Re:Gestione onItemLongClick su Adapter personalizzato
« Risposta #10 il: 08 Ottobre 2010, 00:39:50 CEST »
+1
Ho capito dov'e' l'errore. Il listener non va impostato nella View contenuta in ogni elemento, ma nella ListView stessa. Sempre considerando il tutorial, per funzionare è necessario aggiungere nella onCreate della classe Listview:

Codice (Java): [Seleziona]
            listView.setOnItemLongClickListener(new OnItemLongClickListener() {

                                public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) {
                                       
                                        Person p = (Person)parent.getItemAtPosition(position);
                                       
                                        Toast.makeText(MyListView.this, p.getName(), Toast.LENGTH_SHORT).show();
                                        return false;
                                }
                        });

Grazie a tutti per il supporto!
Ohmnibus
Le mie app su Play Store

È stata trovata una soluzione al tuo problema? Evidenzia il post più utile premendo . È un ottimo modo per ringraziare chi ti ha aiutato.

Offline Ohmnibus

  • Utente senior
  • ****
  • Post: 623
  • Respect: +136
    • Google+
    • @ohmnibus
    • Mostra profilo
    • Lords of Knowledge GdR
  • Dispositivo Android:
    Samsung Galaxy Nexus
  • Play Store ID:
    Ohmnibus
  • Sistema operativo:
    Windows 7 x64
Re:Gestione onItemLongClick su Adapter personalizzato
« Risposta #11 il: 08 Ottobre 2010, 22:14:18 CEST »
0
Argh!

Contr'ordine. Tolgo il "risolto" perché ho visto che se si aggiunge un button nelle righe della lista l'evento itemLongClick non viene più sollevato :-(
Ohmnibus
Le mie app su Play Store

È stata trovata una soluzione al tuo problema? Evidenzia il post più utile premendo . È un ottimo modo per ringraziare chi ti ha aiutato.

Offline Ohmnibus

  • Utente senior
  • ****
  • Post: 623
  • Respect: +136
    • Google+
    • @ohmnibus
    • Mostra profilo
    • Lords of Knowledge GdR
  • Dispositivo Android:
    Samsung Galaxy Nexus
  • Play Store ID:
    Ohmnibus
  • Sistema operativo:
    Windows 7 x64
Re:Gestione onItemLongClick su Adapter personalizzato
« Risposta #12 il: 09 Ottobre 2010, 13:21:39 CEST »
+2
Ho scoperto che è un problema noto e che a riguardo è stata aperta una issue sull'Android Project. Purtroppo lo stato della issue è "declined", per cui in pratica non si può fare.

In pratica nelle ListView non è possibile inserire elementi che possono essere cliccati o che possono ottenere il focus, pena la perdita degli eventi Click e LongClick sulla lista (ma possono comunque essere gestiti negli elementi nella lista).

Nei commenti che seguono la segnalazione della issue viene preso in considerazione l'elenco delle chiamate ricevute: come hanno fatto a gestire un bottone (quello per richiamare il numero indicato) ed il click nell'elemento della lista (per avere dettagli sul chiamante)? Hanno utilizzato un escamotage. Analizzando il codice del suddetto elenco (per fortuna Android è open-source!) si scopre che non è stato utilizzato un Button, bensì una ImageView modificata. La modifica serve solo per non far assumere alla ImageView la colorazione arancione dello sfondo quando viene toccato un elemento della ListView, e quindi per dare l'illusione che si tratti di un tasto a parte.

Codice (Java): [Seleziona]
import android.content.Context;
import android.util.AttributeSet;
import android.view.View;
import android.widget.TextView;

public class DontPressWithParentTextView extends TextView {

        public DontPressWithParentTextView(Context context, AttributeSet attrs) {
                super(context, attrs);
        }

        @Override
        public void setPressed(boolean pressed) {
                // If the parent is pressed, do not set to pressed.
                if (pressed && ((View) getParent()).isPressed()) {
                        return;
                }
                super.setPressed(pressed);
        }

}

Nell'elenco delle ultime chiamate l'escamotage viene applicato ad un ImageView, ma ho notato che funziona anche con i TextView (esempio sopra). Non ho fatto la prova, ma sono convinto che non funzioni nel caso il TextView contenga un link (si rientra nel caso degli elementi cliccabili).

Se lo ritenete opportuno ed utile, posso scrivere un tutorial sull'implementazione di elementi cliccabili contenuti in una ListView.

Saluti.
Ohmnibus
Le mie app su Play Store

È stata trovata una soluzione al tuo problema? Evidenzia il post più utile premendo . È un ottimo modo per ringraziare chi ti ha aiutato.

Offline JD

  • Amministratore
  • Utente storico
  • *****
  • Post: 1600
  • Respect: +232
    • leinardi
    • Mostra profilo
  • Dispositivo Android:
    LG Nexus 5
  • Sistema operativo:
    L'ultima Ubuntu
Re:Gestione onItemLongClick su Adapter personalizzato
« Risposta #13 il: 09 Ottobre 2010, 13:59:47 CEST »
0
Se lo ritenete opportuno ed utile, posso scrivere un tutorial sull'implementazione di elementi cliccabili contenuti in una ListView.

I tutorial sono sempre benvenuti :)
È stata trovata una soluzione al tuo problema?
Evidenzia il post più utile premendo . È un ottimo modo per ringraziare chi ti ha aiutato ;).
E se hai aperto tu il thread marcalo come risolto cliccando !