Autore Topic: Refresh ListView e RadioButton da ArrayList<String>  (Letto 1881 volte)

Offline Andre

  • Utente junior
  • **
  • Post: 62
  • Respect: +1
    • Mostra profilo
Refresh ListView e RadioButton da ArrayList<String>
« il: 23 Luglio 2011, 16:49:53 CEST »
0
Ciao a tutti,

sto cercando di iterare 2 arrayList<String>: uno per le domande caratterizzato dagli elementi di un ARRAY JSON(size: 6), uno per le risposte caratterizzato sempre da un altro ARRAY JSON(size:24 - 4 risposte per ogni domanda). Ho implementato un bottone gestito da un metodo onClick() dove all'interno itero gli arrayList. ogni volta che clicco vorrei incrementare le posizioni degli arrayList in modo da visualizzare le domande e le relative risposte

Per l'arrayList di domande utilizzo il metodo subList(); quindi da 0 a 1 per la prima domanda, da 1 a 2 per la seconda ecc..
Per l'arrayList utilizzo un semplice radio1.setText(arrayListdomande.get(0)); poi 1 2 e così via. Il problema è che il mio approccio è troppo statico. Credo di aver bisogno di qualche metodo particolare per iterare gli arrayList in maniera automatica senza che io debba ogni volta modificare i vari getText().

Ecco un pò di codice:

Codice (Java): [Seleziona]
        //array di domande
        ArrayList<String> strings2 = new ArrayList<String>();
//array di risposte
        ArrayList<String> risposte = new ArrayList<String>();
 nextQuest = (Button)findViewById(R.id.buttonNextQuest);
final Context context = this;
                nextQuest.setOnClickListener(new OnClickListener()
                {
                    public void onClick(View v)
                    {
                        String risp = null;

                        if(v == nextQuest)
                        {
                       
                        if(radio1.isChecked() == true)
                        {
                                        risp=risposte.get(0);
                                       
                                        ls1.setAdapter(new ArrayAdapter<String>(context,
                                        android.R.layout.simple_list_item_1,
                                        strings2.subList(1, 2)));
                                        ls1.setTextFilterEnabled(true);
                                        radio1.setText(risposte.get(4));
                                                        radio2.setText(risposte.get(5));
                                                        radio3.setText(risposte.get(6));
                                                        radio4.setText(risposte.get(7));
                        }
                       
                        else if(radio2.isChecked() == true)
                                        {
                                                        risp=risposte.get(1);
                                                       
                                                        ls1.setAdapter(new ArrayAdapter<String>(context,
                                        android.R.layout.simple_list_item_1,
                                        strings2.subList(1, 2)));
                                        ls1.setTextFilterEnabled(true);        
                                        radio1.setText(risposte.get(4));
                                                        radio2.setText(risposte.get(5));
                                                        radio3.setText(risposte.get(6));
                                                        radio4.setText(risposte.get(7));
                                        }
                        else if(radio3.isChecked() == true)
                        {
                                risp=risposte.get(3);
                                ls1.setAdapter(new ArrayAdapter<String>(context,
                                        android.R.layout.simple_list_item_1,
                                        strings2.subList(1, 2)));
                                        ls1.setTextFilterEnabled(true);        
                                        radio1.setText(risposte.get(4));
                                                        radio2.setText(risposte.get(5));
                                                        radio3.setText(risposte.get(6));
                                                        radio4.setText(risposte.get(7));
                        }
                        else if(radio4.isChecked() == true)
                                        {
                                                        risp=risposte.get(4);
                                                        ls1.setAdapter(new ArrayAdapter<String>(context,
                                                android.R.layout.simple_list_item_1,
                                                strings2.subList(1, 2)));
                                                        ls1.setTextFilterEnabled(true);
                                                        radio1.setText(risposte.get(4));
                                                        radio2.setText(risposte.get(5));
                                                        radio3.setText(risposte.get(6));
                                                        radio4.setText(risposte.get(7));
                                        }
                        else {
                                Toast.makeText(getApplicationContext(), "Devi selezionare una domanda", Toast.LENGTH_LONG).show();
                               
                        }
                               
                        }
                       
                   
                                               
                                               
                    }

Come vi accennavo prima, non è un approccio ottimale. Perchè facendo così dovrei implementare n metodi onClick() per ogni domanda e relative risposte. Sapete darmi qualche esempio a cui riferirmi? Mi sto documentando ma non capisco come fare a risolvere. Vi ringrazio per il vostro prezioso aiuto.

Offline Andre

  • Utente junior
  • **
  • Post: 62
  • Respect: +1
    • Mostra profilo
Re:Refresh ListView e RadioButton da ArrayList<String>
« Risposta #1 il: 24 Luglio 2011, 13:47:22 CEST »
0
qualcuno ha capito cosa vorrei fare?

Offline Andre

  • Utente junior
  • **
  • Post: 62
  • Respect: +1
    • Mostra profilo
Re:Refresh ListView e RadioButton da ArrayList<String>
« Risposta #2 il: 25 Luglio 2011, 13:00:41 CEST »
0
Sostanzialmente, ho inserito 2 for nell'onClick(): uno per il size dell'array di domande e uno che mi scorre l'array di risposte dandomi le risposte relativa ad ogni domanda selezionata.

Il problema è che se inserisco l'indice nell'adapter della ListView tramite il metodo subList(), non riesco a visualizzare la domanda immediatamente successiva ma mi viene restituita l'ultima domanda. Qualcuno mi può dare una mano? Grazie.

Offline 7h38ugg3r

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 1200
  • Respect: +133
    • riccardofischetti
    • th38ugg3r
    • @7h38ugg3r
    • Mostra profilo
  • Dispositivo Android:
    Galaxy-S GT I-9000/ ASUS Eee Pad Transformer
  • Play Store ID:
    Riccardo Fischetti
  • Sistema operativo:
    OS X Lion / Linux Mint 11 (Katya)
Re:Refresh ListView e RadioButton da ArrayList<String>
« Risposta #3 il: 25 Luglio 2011, 14:14:53 CEST »
0
Fatti un array in cui metti i vari radio1, radio2, ..........
In questo array l'indice di radio1 sarà 0, quello di radio2 sarà 1, quello di radioN sarà N-1.
In generale, ciclando per l'array avrai:


Codice (Java): [Seleziona]
if(radio[i].isChecked() == true) {
    risp=risposte.get(i);
    ls1.setAdapter(new ArrayAdapter<String>(context, android.R.layout.simple_list_item_1, strings2.subList(1, 2)));
    ls1.setTextFilterEnabled(true);        
    radio1.setText(risposte.get(4));
    radio2.setText(risposte.get(5));
    radio3.setText(risposte.get(6));
    radio4.setText(risposte.get(7));
}

osservazioni:
1. non si capisce cosa tu ne faccia di risp.
2. posso azzardare che ai vari radio1,2,3,4 setti il testo di risp.get(..)?
altrimenti l'intero ciclo non avrebbe senso......
3.
Codice (Java): [Seleziona]
   ls1.setAdapter(new ArrayAdapter<String>(context, android.R.layout.simple_list_item_1, strings2.subList(1, 2)));
   ls1.setTextFilterEnabled(true);

sembra sempre lo stesso, per cui non ha senso che lo esegui ogni volta; basta metterlo prima del ciclo.



7h38ugg3r<=>thebugger
Non conosci Java? Allora sei nel posto sbagliato!

http://www.androidpatterns.com/

Offline Andre

  • Utente junior
  • **
  • Post: 62
  • Respect: +1
    • Mostra profilo
Re:Refresh ListView e RadioButton da ArrayList<String>
« Risposta #4 il: 25 Luglio 2011, 15:49:30 CEST »
0
grazie 7h38ugg3r
Si risp è il valore "chekkato" che mi servirà dopo per darlo ad un HttpClient per effettuare una query sul db.

Ho risolto così. Praticamente ho dichiarato un indice globale (int i = 0) e questo indice lo passo nell'adapter della List (i,++i). Poi ho dichiarato un metodo OnClickListenere che vado a richiamare ogni qual volta clicco sul bottone in questo modo riesco a fare tutte le iterazioni di cui ho bisogno. Il problema è che dopo un pò ovviamente non trova piu posizioni sia nell'array di domande che nell'array di risposte ed ovviamente crasha mandando un bel "Out of bounds exception" (tanto per cambiare :D ).

C'è un modo per non fargli mandare questa eccezione?

Se non ti è chiaro ecco un pò di codice:

Codice (Java): [Seleziona]
 nextQuest.setOnClickListener(this);
               
                //dichiaro l'evento "btn1Listener" che verrà richiamato ogni qual volta viene pigiato il bottone nextQuest
           View.OnClickListener btn1Listener = new View.OnClickListener() {
                   
               public void onClick(View v)
               {
                       
                  String risp = null;
                        if(v == nextQuest)
                    {
                               
                               
        //qui setto la domanda successiva solo se uno dei radiobutton è in un checked state.
                        if(radio1.isChecked() == true || radio2.isChecked() == true
                        || radio3.isChecked() == true || radio4.isChecked() == true)
                        {
                                       
                                        risp=risposte.get(0);
        //visualizzo la successiva domanda scorrendo l'arraylist di stringhe (start 1 , end 2).
                                        ls1.setAdapter(new ArrayAdapter<String>(context,
                                        android.R.layout.simple_list_item_1,
                                        strings2.subList(i, ++i)));
                                        ls1.setTextFilterEnabled(true);
                                               
         //visualizzo le successive relative risposte.
                        for(j=r;j<r+4;j++)
                        {
                                        radio1.setText(risposte.get(j+4));
                                                        radio2.setText(risposte.get(j+5));
                                                        radio3.setText(risposte.get(j+6));
                                                        radio4.setText(risposte.get(j+7));
                                                       
                        }      
                                        r+=4;
                                                        radioGroup.clearCheck();
                                 
                        }
                       
                     }
                       
                 }
               
             };
               
             //richiamo il metodo onClick
                nextQuest.setOnClickListener(btn1Listener);
               

Offline 7h38ugg3r

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 1200
  • Respect: +133
    • riccardofischetti
    • th38ugg3r
    • @7h38ugg3r
    • Mostra profilo
  • Dispositivo Android:
    Galaxy-S GT I-9000/ ASUS Eee Pad Transformer
  • Play Store ID:
    Riccardo Fischetti
  • Sistema operativo:
    OS X Lion / Linux Mint 11 (Katya)
Re:Refresh ListView e RadioButton da ArrayList<String>
« Risposta #5 il: 25 Luglio 2011, 17:05:59 CEST »
0
beh, semplicemente se i >= della lunghezza della lista, allora hai finito e non devi più mettere listener.
7h38ugg3r<=>thebugger
Non conosci Java? Allora sei nel posto sbagliato!

http://www.androidpatterns.com/

Offline Andre

  • Utente junior
  • **
  • Post: 62
  • Respect: +1
    • Mostra profilo
Re:Refresh ListView e RadioButton da ArrayList<String>
« Risposta #6 il: 25 Luglio 2011, 17:30:52 CEST »
0
Sto provando in questo modo ma va in crash. (logcat muto).

Questo setText che vedi qui praticamente setta i radiobutton SOLO dopo aver cliccato quindi itera l'array di risposte una posizione per volta. Al termine incremento r di 4 per cercare le successive 4 risposte.

Codice (Java): [Seleziona]
int r=0;
int j=1;
...
for(j=r;j<r+4;j++)
                        {
                                        radio1.setText(risposte.get(j+1));
                                                        radio2.setText(risposte.get(j+2));
                                                        radio3.setText(risposte.get(j+3));
                                                        radio4.setText(risposte.get(j+4));
                                                       
                        }      
                       
                                                        radioGroup.clearCheck();
                                 
                        }
                        r+=4;
...


 if(r <= risposte.size())
                {
             //richiamo il metodo onClick
                nextQuest.setOnClickListener(btn1Listener);
                }


Se clicco sul bottone next crasha. Ho provato anche con un while e anche ad invertire il <= con il >= ma il risultato è lo stesso. L'ho messo anche sopra prima dell'inizio del metodo onClick ma sempre lo stesso risultato.

Offline Andre

  • Utente junior
  • **
  • Post: 62
  • Respect: +1
    • Mostra profilo
Re:Refresh ListView e RadioButton da ArrayList<String>
« Risposta #7 il: 25 Luglio 2011, 18:04:27 CEST »
0
No aspè, comincio ad esser cotto. Non crasha più, semplicemente cliccavo sul tasto next senza aver selezionato una radio. :-\ :-\ però comunque se provo a scorrere l'array di risposte e arrivo al termine mi va ancora in crash anche se ho implementato quell'if (r<risposte.size()).

Offline Ricky`

  • Amministratore
  • Utente storico
  • *****
  • Post: 3489
  • Respect: +506
    • Github
    • Google+
    • rciovati
    • Mostra profilo
Re: Refresh ListView e RadioButton da ArrayList<String>
« Risposta #8 il: 25 Luglio 2011, 22:44:35 CEST »
0
No doppi post, usa il tasto modifica.

Sent from my HTC Desire

Offline 7h38ugg3r

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 1200
  • Respect: +133
    • riccardofischetti
    • th38ugg3r
    • @7h38ugg3r
    • Mostra profilo
  • Dispositivo Android:
    Galaxy-S GT I-9000/ ASUS Eee Pad Transformer
  • Play Store ID:
    Riccardo Fischetti
  • Sistema operativo:
    OS X Lion / Linux Mint 11 (Katya)
Re:Refresh ListView e RadioButton da ArrayList<String>
« Risposta #9 il: 26 Luglio 2011, 09:08:07 CEST »
0
1) spiega meglio in che situazione crasha.
2) il logcat muto non esiste....soprattutto se l'app crasha. Secondo me non hai ben chiaro come catchare gli errori.
Se metti il try/catch e poi non stampi l'errore, ovviamente il logcat sarà muto.
Tanto vale che tu non metta nessun try/catch, così il logcat comincia a parlare.
3) se guardi il codice che hai postato, c'è una "}" in più, nel senso che non si capisce cosa chiuda, quindi è bene che posti codice più "coerente" e più pulito.
7h38ugg3r<=>thebugger
Non conosci Java? Allora sei nel posto sbagliato!

http://www.androidpatterns.com/

Offline Ricky`

  • Amministratore
  • Utente storico
  • *****
  • Post: 3489
  • Respect: +506
    • Github
    • Google+
    • rciovati
    • Mostra profilo
Re:Refresh ListView e RadioButton da ArrayList<String>
« Risposta #10 il: 26 Luglio 2011, 11:03:42 CEST »
0
Prima di postare del codice formattalo premendo ctrl + shift + f  che altrimenti non si capisce un cavolo.

Offline Andre

  • Utente junior
  • **
  • Post: 62
  • Respect: +1
    • Mostra profilo
Re:Refresh ListView e RadioButton da ArrayList<String>
« Risposta #11 il: 26 Luglio 2011, 11:14:25 CEST »
0
Codice (Java): [Seleziona]
ArrayList<String> strings2 = new ArrayList<String>();
        ArrayList<String> risposte = new ArrayList<String>();

        int i = 1;
        int r = 0;
                int j = 0;
               
        @Override
    public void onCreate(Bundle icicle)

    {
                //passaggio di dati fra activity per tener conto dell'utente appena loggato.
                Bundle b = getIntent().getExtras();
                String user = b.getString("il dato inserito è: " );
                Toast.makeText(getBaseContext(), "Benvenuto: " + user ,
                Toast.LENGTH_LONG).show();
           
                //array list per memorizzare l'output json
               

                super.onCreate(icicle);
                setContentView(R.layout.managerdb);
                ls1 = (ListView) findViewById(R.id.list);
                radioGroup = (RadioGroup)findViewById(R.id.radioGroup1);
                radio1 = (RadioButton)findViewById(R.id.radioButton1);
                radio2 = (RadioButton)findViewById(R.id.radioButton2);
                radio3 = (RadioButton)findViewById(R.id.radioButton3);
                radio4 = (RadioButton)findViewById(R.id.radioButton4);
                       
                //bottone per ottenere la domanda successiva.
                 nextQuest = (Button)findViewById(R.id.buttonNextQuest);
                 t1 = (TextView)findViewById(R.id.TextView01);
                final Context context = this;
               
               
                nextQuest.setOnClickListener(this);
               
                //dichiaro l'evento "btn1Listener" che verrà richiamato ogni qual volta viene pigiato il bottone nextQuest
           View.OnClickListener btn1Listener = new View.OnClickListener() {
                  @Override  
               public void onClick(View v)
               {
                       
                 
                        if(v == nextQuest)
                    {
                               
                               
        //qui setto la domanda successiva solo se uno dei radiobutton è in un checked state.
                        if(radio1.isChecked() == true || radio2.isChecked() == true
                        || radio3.isChecked() == true || radio4.isChecked() == true)
                        {
                       
                       
                                       
        //visualizzo la successiva domanda scorrendo l'arraylist di stringhe (start 1 , end 2).
                                        ls1.setAdapter(new ArrayAdapter<String>(context,
                                        android.R.layout.simple_list_item_1,
                                        strings2.subList(i, ++i)));
                                        ls1.setTextFilterEnabled(true);
                                               
         //visualizzo le successive relative risposte.
                        for(j=r;j<r+4;j++)
                        {
                                        radio1.setText(risposte.get(j+1));
                                                        radio2.setText(risposte.get(j+2));
                                                        radio3.setText(risposte.get(j+3));
                                                        radio4.setText(risposte.get(j+4));
                                                       
                        }      
                                       
                                 
                        }
                        else (Toast.makeText(context, "Devi selezionare una domanda", Toast.LENGTH_LONG)).show();
                        r+=4;
                     }
                       
                 }
               
             };
             if(r <= risposte.size())
                {
             //richiamo il metodo onClick
             nextQuest.setOnClickListener(btn1Listener);
               }

Bene. Adesso è piu chiaro? Grazie ragazzi :)

In teoria dovrei verificare questa condizione anche sulla dimensione dell'array di domande, altrimenti andrebbe cmq in exception.
« Ultima modifica: 26 Luglio 2011, 12:35:36 CEST da Andre »

Offline 7h38ugg3r

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 1200
  • Respect: +133
    • riccardofischetti
    • th38ugg3r
    • @7h38ugg3r
    • Mostra profilo
  • Dispositivo Android:
    Galaxy-S GT I-9000/ ASUS Eee Pad Transformer
  • Play Store ID:
    Riccardo Fischetti
  • Sistema operativo:
    OS X Lion / Linux Mint 11 (Katya)
Re:Refresh ListView e RadioButton da ArrayList<String>
« Risposta #12 il: 26 Luglio 2011, 11:30:03 CEST »
0
fammi capire...
tu stai richiamando il codice dentro la onclick invocando il setonclicklistener?

ad ogni modo, dove ti da crash? visto che non hai try/catch, il logcat dovrebbe parlare......
7h38ugg3r<=>thebugger
Non conosci Java? Allora sei nel posto sbagliato!

http://www.androidpatterns.com/

Offline Andre

  • Utente junior
  • **
  • Post: 62
  • Respect: +1
    • Mostra profilo
Re:Refresh ListView e RadioButton da ArrayList<String>
« Risposta #13 il: 26 Luglio 2011, 12:18:14 CEST »
0
infatti ora parla. :)

ecco qua:

Codice: [Seleziona]
07-26 12:16:32.836: ERROR/AndroidRuntime(480): FATAL EXCEPTION: main
07-26 12:16:32.836: ERROR/AndroidRuntime(480): java.lang.IndexOutOfBoundsException
07-26 12:16:32.836: ERROR/AndroidRuntime(480):     at java.util.AbstractList.subList(AbstractList.java:745)
07-26 12:16:32.836: ERROR/AndroidRuntime(480):     at com.android.quizzle.MainMenuActivity$1.onClick(MainMenuActivity.java:139)
07-26 12:16:32.836: ERROR/AndroidRuntime(480):     at android.view.View.performClick(View.java:2408)
07-26 12:16:32.836: ERROR/AndroidRuntime(480):     at android.view.View$PerformClick.run(View.java:8816)
07-26 12:16:32.836: ERROR/AndroidRuntime(480):     at android.os.Handler.handleCallback(Handler.java:587)
07-26 12:16:32.836: ERROR/AndroidRuntime(480):     at android.os.Handler.dispatchMessage(Handler.java:92)
07-26 12:16:32.836: ERROR/AndroidRuntime(480):     at android.os.Looper.loop(Looper.java:123)
07-26 12:16:32.836: ERROR/AndroidRuntime(480):     at android.app.ActivityThread.main(ActivityThread.java:4627)
07-26 12:16:32.836: ERROR/AndroidRuntime(480):     at java.lang.reflect.Method.invokeNative(Native Method)
07-26 12:16:32.836: ERROR/AndroidRuntime(480):     at java.lang.reflect.Method.invoke(Method.java:521)
07-26 12:16:32.836: ERROR/AndroidRuntime(480):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
07-26 12:16:32.836: ERROR/AndroidRuntime(480):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
07-26 12:16:32.836: ERROR/AndroidRuntime(480):     at dalvik.system.NativeStart.main(Native Method)
Ovviamente va in outOfBounds xkè non trova piu ne risposte ne domande. Quella if prima della chiamata al clickListener non va bene?

@Debugger

Cmq no, la condizione che ho implementato è fuori dal metodo onClick();..


Cmq cerco di spiegare meglio il mio problema:
Praticamente ho un evento (onClickListener) che viene richiamato ogni volta che clicco appunto sul bottone. Ogni volta che clicco sul bottone scorro l'arraylist di domande (incrementando un indice tramite il metodo subList()) e l'arraylist di domande (per farlo uso un ciclo for indicizzato da 2 array j e r; j lo uso per settare i textValues ed r lo uso una volta uscito dal ciclo for per incrementare di 4 posizioni l'arraylist di risposte. In questo modo ogni volta che clicco riesco ad avere le domande successive e le 4 risposte relative).Ovviamente, una volta che ho finito di fare lo scorrimento di entrambi gli array non voglio che vadi in outOfBounds quindi su suggerimento di 7h38ugg3r ho impostato una condizione appena fuori dal metodo onClick() e questa condizione pone :

if(r<risposte.size())
//richiamo l'evento onClickListener in modo da reiterare il tutto e quindi scorrere nuovamente l'array.

Spero di essere stato piu chiaro. Mi rendo conto che in realtà si tratti di un errore di indicizzazione poichè la prima domanda la setto senza entrare nel metodo onClick() quindi scorro l'arraylist di risposte dalle posizioni 0 a 3.

Supponendo che sia questo il problema, suppongo che debba settare manualmente il numero di posizioni che l'indice deve scorrere tipo se l'array è di 23 posizioni (compreso lo 0) ed io ho già impostato le prime 4, dovrei porre l'indice minore di 19?
« Ultima modifica: 26 Luglio 2011, 16:19:19 CEST da Andre »