Autore Topic: ListActivity e CursorAdapter  (Letto 1155 volte)

Offline supporto81

  • Nuovo arrivato
  • *
  • Post: 15
  • Respect: 0
    • Mostra profilo
ListActivity e CursorAdapter
« il: 18 Agosto 2011, 15:52:47 CEST »
0
Ciao a tutti,
ho un problema che mi sta facendo perdere la testa.

Spero possiate essermi di aiuto:
Ho una ListActivity che viene popolata tramite cursore e relativo CursorAdapter.
Quello che non riesco a capire è perchè quando effettuo lo scroll della lista viene invocato sempre il metodo:"bindView" del CursorAdapter.
Questa cosa mi crea non pochi problemi con il button afferenti al list_item.
Probabilmente ho completamente sbagliato a gestire la funzionalità.

ho fatto una cosa del genere sapendo che il cursore ha sempre e solo 5 elementi:
1) ho definito 5 button all'interno del Cursor Adapter.
2)a seconda dell'id del cursor eseguo la seguente assegnazione:
mButt1 = (Button) view.findViewById(R.id.button1);
mButt2 = (Button) view.findViewById(R.id.button1);
...
3)per ogni button ho fatto una cosa del genere:
Codice: [Seleziona]
                        mButt1.setOnClickListener(new View.OnClickListener() {
                                @Override
                                public void onClick(View v) {
mButt1.setBackgroundColor(Color.GREEN);
mButt2.setBackgroundColor(Color.RED);
...

}
});

Al click dei button tutto funziona correttamente, ovvero i button si colorano nel modo desiderato.
il problema è che quando scrollo la lista i button si colorano a casaccio.

Come posso ovviare a tale problema?
si puo evitare di richiamare all'atto dello scroll il metodo bindView del CursorAdapter?

Grazie per l'aiuto

Offline supporto81

  • Nuovo arrivato
  • *
  • Post: 15
  • Respect: 0
    • Mostra profilo
Re:ListActivity e CursorAdapter
« Risposta #1 il: 18 Agosto 2011, 17:32:16 CEST »
0
Ho porovato anche il seguente codice all'interno del metodo BindView
Codice: [Seleziona]
                ((WebView) view.findViewById(R.id.webView1)).loadData(cursor.getString(2),"text/html", "utf-8");
                ((Button) view.findViewById(R.id.button1)).setText(cursor.getString(0));
                {
                        if(cursor.getString(0).equals("A"))
                        {
                                ((Button) view.findViewById(R.id.button1)).setBackgroundColor(Color.BLUE);
                        }
                        else if(cursor.getString(0).equals("B"))
                        {
                                ((Button) view.findViewById(R.id.button1)).setBackgroundColor(Color.GREEN);
                        }
                }

Qaundo carico la lista i bottoni sono colorati correttamente, quando poi scrollo risultano colorati anche i bottoni che al principio non lo erano.

AIUTO!!!! :(

Offline Ricky`

  • Amministratore
  • Utente storico
  • *****
  • Post: 3489
  • Respect: +506
    • Github
    • Google+
    • rciovati
    • Mostra profilo
Re:ListActivity e CursorAdapter
« Risposta #2 il: 18 Agosto 2011, 17:38:11 CEST »
0
Siccome gli oggetti View che rappresentato la riga vengono riciclati devi sempre "resettare" lo stato delle View al suo interno. In questo caso dovresti preventivamente settare il colore originale al/ai bottoni.

Offline supporto81

  • Nuovo arrivato
  • *
  • Post: 15
  • Respect: 0
    • Mostra profilo
Re:ListActivity e CursorAdapter
« Risposta #3 il: 18 Agosto 2011, 18:04:28 CEST »
0
Grazie Ricky,
ho cercato di applicare il tuo consiglio, ma non ci sono siuscito.
Ho problemi nel primo codice che ho postato.

nel metodo bindView ho fatto una cosa del genere

Codice: [Seleziona]
public void bindView(View view, Context context, Cursor cursor)
{
((WebView) view.findViewById(R.id.webView1)).loadData(cursor.getString(2),"text/html", "utf-8");
                if(cursor.getString(0).equals("A"))
                {
                        mButtA = (Button) view.findViewById(R.id.button1);
                        mButtA.setText("A");
                }
                else if(cursor.getString(0).equals("B"))
               {
                        mButtB = (Button) view.findViewById(R.id.button1);
                        mButtB.setText("B");
               }
                else if(cursor.getString(0).equals("C"))
               {
                        mButtC = (Button) view.findViewById(R.id.button1);
                        mButtC.setText("C");
               }
                else if(cursor.getString(0).equals("D"))
               {
                        mButtD = (Button) view.findViewById(R.id.button1);
                        mButtD.setText("D");
               }
                else
               {
                        mButtE = (Button) view.findViewById(R.id.button1);
                        mButtE.setText("E");
               }

mButtA.setOnClickListener(new View.OnClickListener() {
                                @Override
                                public void onClick(View v) {
                                                    mButtA.setBackgroundColor(Color.BLUE);
mButtB.setBackgroundColor(Color.GREEN);
mButtC.setBackgroundColor(Color.RED);
mButtD.setBackgroundColor(Color.GRAY);
mButtE.setBackgroundColor(Color.BLACK);

}
});


}


Quando viene caricata la lista tutto va bene.
quando scrollo i colori vanno a casaccio.

Come dovrei fare in questo particolare caso.

Grazie
« Ultima modifica: 18 Agosto 2011, 18:09:48 CEST da supporto81 »

Offline Ricky`

  • Amministratore
  • Utente storico
  • *****
  • Post: 3489
  • Respect: +506
    • Github
    • Google+
    • rciovati
    • Mostra profilo
Re:ListActivity e CursorAdapter
« Risposta #4 il: 18 Agosto 2011, 20:19:36 CEST »
0
ma come mai tutti i bottoni li prendi facendo il findViewById dalla stessa risorsa? :S

Offline supporto81

  • Nuovo arrivato
  • *
  • Post: 15
  • Respect: 0
    • Mostra profilo
Re:ListActivity e CursorAdapter
« Risposta #5 il: 18 Agosto 2011, 21:04:03 CEST »
0
ho una lista che si basa su un list item costituito da 2 risorse:
1 button
i text view

ora nella lista compariranno sempre e solo 5 item

quando clicco un bottone l'azione deve ripercuotersi sugli altri.

Se ho agito in modo non corretto, mi sapresti proporre la metodologia migliore per fare ciò che mi serve?

Grazie mille

Offline Ricky`

  • Amministratore
  • Utente storico
  • *****
  • Post: 3489
  • Respect: +506
    • Github
    • Google+
    • rciovati
    • Mostra profilo
Re:ListActivity e CursorAdapter
« Risposta #6 il: 18 Agosto 2011, 22:45:18 CEST »
0
ho una lista che si basa su un list item costituito da 2 risorse:
1 button
i text view

ora nella lista compariranno sempre e solo 5 item

quando clicco un bottone l'azione deve ripercuotersi sugli altri.

Se ho agito in modo non corretto, mi sapresti proporre la metodologia migliore per fare ciò che mi serve?

Grazie mille

Quindi mi sembra di capire che tu alla pressione del bottone cerchi di accedere ai bottoni presenti nella altre righe: non puoi farlo.
Idealmente per fare quello che ti serve il procedimento è questo: l'utente preme il bottone -> intercetti l'evento -> modifichi la sorgente dati a cui è associata la ListView (secondo la quale l'adapter crea le singole righe) -> chiami il metodo notifyDatasetChanged in modo tale che la ListView venga interamente aggiornata.

Offline supporto81

  • Nuovo arrivato
  • *
  • Post: 15
  • Respect: 0
    • Mostra profilo
Re:ListActivity e CursorAdapter
« Risposta #7 il: 19 Agosto 2011, 09:34:46 CEST »
0
Ciao Ricky,
grazie per la risposta, ma non sono d'accordo con quanto dici...semplicemente perchè ora tutto funziona correttamente senza stravolgere la logica adottata.

Ho risolto in questo modo:
1)Ho creato5 variabili nelle quali all'atto della pressione del bottone vado a memorizzare il colore che voglio associare al singolo Button
2)Ho poi modificato questa prozione di codice in questo modo:
Codice: [Seleziona]
                if(cursor.getString(0).equals("A"))
                {
                        mButtA = (Button) view.findViewById(R.id.button1);
                        mButtA.setText("A");
                        //Codice aggiunto
                        if(colorA!=-1)
                        {
                             mButtA.setBackgroundColor(colorA);
                        }
                        else
                        {
                             mButtA.setBackgroundColor(colorStandard);
                         }
                }
                else if(cursor.getString(0).equals("B"))
               {
                        mButtB = (Button) view.findViewById(R.id.button1);
                        mButtB.setText("B");
               }
                else if(cursor.getString(0).equals("C"))
               {
                        mButtC = (Button) view.findViewById(R.id.button1);
                        mButtC.setText("C");
               }
                else if(cursor.getString(0).equals("D"))
               {
                        mButtD = (Button) view.findViewById(R.id.button1);
                        mButtD.setText("D");
               }
                else
               {
                        mButtE = (Button) view.findViewById(R.id.button1);
                        mButtE.setText("E");
               }

nel codice postato ho aggiunto il codice solo per il button a...Il tutto si ripete anche per gli altri button.

Che ne pensi.
Ora tutto funziona :)

Offline supporto81

  • Nuovo arrivato
  • *
  • Post: 15
  • Respect: 0
    • Mostra profilo
Re:ListActivity e CursorAdapter
« Risposta #8 il: 19 Agosto 2011, 09:37:32 CEST »
0
Mi servirebbe solo una info per migliorare un aspetto:

Quando la ListView viene caricata la prima volta, e non quindi durante la fase di scroll, visulizzo prima la list view collassata su se stessa che poi mano mano si popola.
Come potrei ovviare a questa cosa, magari con una animazione che renda l'interfaccia più user friendly?

Grazie

Offline supporto81

  • Nuovo arrivato
  • *
  • Post: 15
  • Respect: 0
    • Mostra profilo
Re:ListActivity e CursorAdapter
« Risposta #9 il: 21 Agosto 2011, 11:48:52 CEST »
0
Alla fine dopo molti problemi, tanti dei quali risolti grazie al forum sono riuscito a pubblicare la mia prima app:)

https://market.android.com/details?id=it.medicina.beadoctor

Ricky come puoi vedere sono riuscito a fare questo:

"alla pressione del bottone cerchi di accedere ai bottoni presenti nella altre righe"

Mi rendo conto che cmq non è il modo migliore per gestire la listview.

Solo che volevo pubblicare l'app il prima possibile dato che i test di ammissione stanno a breve :)

Ora posso cercare di migliorare con calma:)

grazie ancora

Offline Ricky`

  • Amministratore
  • Utente storico
  • *****
  • Post: 3489
  • Respect: +506
    • Github
    • Google+
    • rciovati
    • Mostra profilo
Re: Re:ListActivity e CursorAdapter
« Risposta #10 il: 21 Agosto 2011, 13:23:24 CEST »
0
I

Ricky come puoi vedere sono riuscito a fare questo:

"alla pressione del bottone cerchi di accedere ai bottoni presenti nella altre righe

Beh scrivendo brutto codice riesci a fare tutto o quasi.

Sent from my HTC Desire