Autore Topic: SimpleCursorAdapter e setViewBinder: problema con un CheckBox  (Letto 1034 volte)

Offline Paciotti

  • Utente junior
  • **
  • Post: 51
  • Respect: 0
    • sergiofabbrini
    • paciotti83
    • paciotti
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy S
  • Play Store ID:
    Paciotti
  • Sistema operativo:
    Mac OS X 10.6 & Ubuntu 10.10
0
In una prova fatta in precedenza (se non sbaglio con un arrayAdapter), il settaggio dello stato della ChecBox del mio layout di linea (ovviamente all'interno di una ListView) avveniva automaticamente. Sembra che con il SimpleCursorAdapter invece questo non accada e si debba ricorrere al setViewBinder. Nessun problema:
Codice (Java): [Seleziona]
private void updatePrefixes() {
        db = new DBUtil(getApplicationContext());
        db.open();
        Cursor c = db.getAllPrefix();
        startManagingCursor(c);

        SimpleCursorAdapter adapter = new SimpleCursorAdapter(this,
                R.layout.pref_line, c, new String[] {
                        DBUtil.PrefixFields.PREFIX_ACTIVE,
                        DBUtil.PrefixFields.PREFIX_NAME,
                        DBUtil.PrefixFields.PREFIX_CODE }, new int[] {
                        R.id.active, R.id.name, R.id.prefix });
        adapter.setViewBinder(new SimpleCursorAdapter.ViewBinder() {
                public boolean setViewValue(View view, Cursor cursor, int columnIndex) {
                        if (columnIndex == 1) {
                                CheckBox cb = (CheckBox) view;          // <---------------------------
                                cb.setChecked(cursor.getInt(columnIndex) == 0 ? false : true);
                                return true;
                        }
                        return false;
                }
        });
        prefixList.setAdapter(adapter);
        db.close();
}
In teoria (e anche nella pratica di mille altri esempi trovati in rete) dovrebbe funzionare, ma all'esecuzione della riga evidenziata l'app va in crash. Ho provato ad eseguirla commentando l'interno dell'if e funziona, quindi sembra che sia proprio il cast della View in CheckBox che faccia andare tutto in crisi.
Non ho la più pallida idea di cosa succeda e come risolvere!
Qualcuno mi aiuta?

Offline Ricky`

  • Amministratore
  • Utente storico
  • *****
  • Post: 3489
  • Respect: +506
    • Github
    • Google+
    • rciovati
    • Mostra profilo
Re:SimpleCursorAdapter e setViewBinder: problema con un CheckBox
« Risposta #1 il: 20 Marzo 2011, 16:40:10 CET »
+1
Prova a cambiare l'if in:
Codice (Java): [Seleziona]
                        if (view instanceof CheckBox) {
                                CheckBox cb = (CheckBox) view;          // <---------------------------
                                cb.setChecked(cursor.getInt(columnIndex) == 0 ? false : true);
                                return true;
                        }

Offline Paciotti

  • Utente junior
  • **
  • Post: 51
  • Respect: 0
    • sergiofabbrini
    • paciotti83
    • paciotti
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy S
  • Play Store ID:
    Paciotti
  • Sistema operativo:
    Mac OS X 10.6 & Ubuntu 10.10
Re:SimpleCursorAdapter e setViewBinder: problema con un CheckBox
« Risposta #2 il: 20 Marzo 2011, 16:49:36 CET »
0
Ok, va bene che te sei più esperto di me, ma questa non dovrebbe essere una scienza sicura???
Il tuo metodo funziona, ma a questo punto mi viene da pensare che il numero della colonna non indichi il giusto... Però nella riga sotto quando devo andare a prendere l'intero della relativa colonna non dà problemi.
Insomma, come al solito sono felice di aver risolto, ma sempre con quell'amaro in bocca di usare una soluzione alla quale probabilmente non avrei mai pensato!
Grazie mille!

Offline Paciotti

  • Utente junior
  • **
  • Post: 51
  • Respect: 0
    • sergiofabbrini
    • paciotti83
    • paciotti
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy S
  • Play Store ID:
    Paciotti
  • Sistema operativo:
    Mac OS X 10.6 & Ubuntu 10.10
Re:SimpleCursorAdapter e setViewBinder: problema con un CheckBox
« Risposta #3 il: 21 Marzo 2011, 16:22:50 CET »
0
Il problema con il checkbox che non settava lo stato è risolto, ma mi permetto di riaprire il topic per arrivare ad una soluzione utilizzabile: non riesco in nessun modo a settare un listener per il click su un elemento della lista, nè per cercare di gestire le azioni sui checkbox.
Anche cercando sul forum non ho trovato niente che mi sia di aiuto.
Qualche consiglio?
EDIT: Ho dimenticato il codice che sto utilizzando senza successo:
Codice (Java): [Seleziona]
prefixList.setOnItemClickListener(new OnItemClickListener() {
        public void onItemClick(AdapterView<?> parent, View view,
                int position, long id) {
                Toast.makeText(getApplicationContext(), position,
                Toast.LENGTH_SHORT).show();
        }
});
« Ultima modifica: 21 Marzo 2011, 16:26:09 CET da Paciotti »

Offline Paciotti

  • Utente junior
  • **
  • Post: 51
  • Respect: 0
    • sergiofabbrini
    • paciotti83
    • paciotti
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy S
  • Play Store ID:
    Paciotti
  • Sistema operativo:
    Mac OS X 10.6 & Ubuntu 10.10
Re:SimpleCursorAdapter e setViewBinder: problema con un CheckBox
« Risposta #4 il: 21 Marzo 2011, 23:47:35 CET »
0
Ho trovato un modo per ovviare al problema del click (tramite l'attributo onClick della viewGroup della riga), ma andando avanti con il progetto mi sono reso conto che è indispensabile che funzioni il listener per poter settare anche quello per il longClick...
Penso di aver veramente esaurito le risorse, quindi aspetto un consiglio da qualcuno di voi esperti.
Grazie.

Offline Paciotti

  • Utente junior
  • **
  • Post: 51
  • Respect: 0
    • sergiofabbrini
    • paciotti83
    • paciotti
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy S
  • Play Store ID:
    Paciotti
  • Sistema operativo:
    Mac OS X 10.6 & Ubuntu 10.10
Re:SimpleCursorAdapter e setViewBinder: problema con un CheckBox
« Risposta #5 il: 22 Marzo 2011, 11:58:57 CET »
0
Penso di aver trovato l soluzione: non c'è soluzione semplice!
Come spiegato da Ohmnibus in questo tutorial, nella gestione delle ListView di Android compare un bug quando all'interno del layout di riga compaiono elementi cliccabili.
La soluzione è nel topic linkato, ma come ho detto non è poi così semplice ed immediata...
Sto valutando l'ipotesi di costruirmi una view/layout custom, ma forse è ancora più difficile (sarebbe bello costruirne uno facilmente personalizzabile da mettere a disposizione di tutto il forum, se faccio progressi vi aggiorno).
Buona fortuna a chi imbocca questa strada.

Offline Paciotti

  • Utente junior
  • **
  • Post: 51
  • Respect: 0
    • sergiofabbrini
    • paciotti83
    • paciotti
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy S
  • Play Store ID:
    Paciotti
  • Sistema operativo:
    Mac OS X 10.6 & Ubuntu 10.10
Re: SimpleCursorAdapter e setViewBinder: problema con un CheckBox
« Risposta #6 il: 22 Marzo 2011, 20:04:11 CET »
0
O non ho risolto davvero!
Studiando bene il bug, ho pensato che se c'è un problema di propagazione di eventi alle entry della listView quando nella view della linea ci sono elementi cliccabili... basta non usare il click sulla entry della listView!
In pratica ripieno il layout con la/le textview che rendo cliccabili, poi uso il viewBinder per impostare tutti i listener che voglio (sia sul checkbox/button che su tutti gli altri componenti cliccabili). Non so quanto sia una soluzione elegante, ma vi garantisco che funziona. Il tutto senza dover riscrivere componenti personalizzati, ma con un semplice viewBinder.
Non sono in grado di capire se ci sono controindicazioni per questa soluzione, quindi se qualcuno potesse confermarmi che è valida non mi dispiacerebbe.
Ora non posso, ma più tardi vi posto il codice.

Sent from my GT-I9000 using Tapatalk