Autore Topic: Crash onItemClick  (Letto 532 volte)

Offline Andre

  • Utente junior
  • **
  • Post: 62
  • Respect: +1
    • Mostra profilo
Crash onItemClick
« il: 14 Giugno 2011, 20:49:20 CEST »
0
Ciao ragazzi, ho un problema con un listener di una ListView. Faccio il retrieval da php e inserisco i valori tramite JSON in 2 arrayList. Uno per un campo e uno per un altro. Se clicco sul primo campo del listener, l'app passa dei valori tramite il putExtras che mi serviranno per il POST nella prossima classe e visualizza il retrieval senza alcun tipo di problema. Se clicco su un'altra position, l'app va in crash.

Ho fatto anche un pò di debug inserendo un toast che mi visualizza i 2 arrayList e i dati arrivano e sono esatti. Cosa sbaglio?

Codice (Java): [Seleziona]
package com.android.quizzle;

import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;

import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.client.HttpClient;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.DefaultHttpClient;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import android.app.Activity;
import android.content.Intent;
import android.net.ParseException;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;

public class MainMenuActivity extends Activity {

       
       
        private ListView ls1;
        String result = null;
        InputStream is = null;
        StringBuilder sb=null;
        JSONArray jArray;
        private String nomequiz;
        private String domanda;
        //array list per memorizzare l'output json
        ArrayList<String> stringsNomeQuiz = new ArrayList<String>();
        ArrayList<String> stringsTestoQuiz = new ArrayList<String>();

        @Override
    public void onCreate(Bundle icicle)

    {
                super.onCreate(icicle);
        setContentView(R.layout.tabquiz);
       
      //passaggio di dati dalla precedente activity
                Bundle b = getIntent().getExtras();
                String user = b.getString("utente: ");
                Toast.makeText(getBaseContext(), "user: " + user ,
                Toast.LENGTH_LONG).show();
               

        ls1 = (ListView) findViewById(R.id.list);
       
             
                // query post.

                ArrayList<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();
               

                // http post

                try {
                        HttpClient httpclient = new DefaultHttpClient();
                        HttpPost httppost = new HttpPost("http://labinform.altervista.org/Android/quiz.php");
                        httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
                        HttpResponse response = httpclient.execute(httppost);
                        HttpEntity entity = response.getEntity();
                        is = entity.getContent();
                } catch (Exception e) {
                        Log.e("log_tag", "Error in http connection " + e.toString());
                }

                // convert response to string

                try {

                        BufferedReader reader = new BufferedReader(new InputStreamReader(
                                        is, "iso-8859-1"), 8);
                        sb = new StringBuilder();
                        sb.append(reader.readLine() + "\n");
                        String line="0";                       
                        while ((line = reader.readLine()) != null) {
                                sb.append(line + "\n");
                        }
                        is.close();
                        result = sb.toString();

                }
               
                catch (Exception e) {
                        Log.e("log_tag", "Error converting result " + e.toString());
                }

       
                //paring data
               
                 
                try{
                        jArray = new JSONArray(result);
            JSONObject json_data=null;
           
            for(int i=0;i<jArray.length();i++){
                    json_data = jArray.getJSONObject(i);
                    nomequiz=json_data.getString("nome");
                    domanda=json_data.getString("testo");
                    stringsNomeQuiz.add(nomequiz);
                    stringsTestoQuiz.add(domanda);
                    Toast.makeText(getBaseContext(), "Tag quiz: " + nomequiz + "Testoquiz: " + domanda,
                                     Toast.LENGTH_LONG).show();
            }
                         
                }catch(JSONException e1){
                      Toast.makeText(getBaseContext(), "Nessun quiz trovato" ,
                                     Toast.LENGTH_LONG).show();
                } catch (ParseException e1) {
                      e1.printStackTrace();
                }
                       
                ls1.setAdapter(new ArrayAdapter<String>(this,
                                android.R.layout.simple_list_item_1,
                                stringsNomeQuiz));
                ls1.setTextFilterEnabled(true);
                ls1.setOnItemClickListener(new OnItemClickListener() {

                        @Override
                         public void onItemClick(AdapterView<?> a, View v, int position, long id) {
                                int x = position;
                        String nomeQuiz = "";
                        String domanda = "";
                               
                                if (x==0)
                          {
                                        //match campi array. Successivamente questi campi serviranno per effettuare la query
                                        //in base ai tag.
                                       
                                    nomeQuiz = stringsNomeQuiz.get(0);
                                    domanda = stringsTestoQuiz.get(0);

                                        Intent i = new Intent();
                                  i.setClass(MainMenuActivity.this, DatabaseActivity.class);
                            i.putExtra("il dato inserito è: ", nomeQuiz);
                            i.putExtra("La domanda scelta é: ", domanda);
                            startActivity(i);
                                       
                          }
                                else if(x==1)
                          {
                                  nomeQuiz = stringsNomeQuiz.get(1);
                                            domanda = stringsTestoQuiz.get(1);

                                                Intent i = new Intent();
                                          i.setClass(MainMenuActivity.this, DatabaseActivity.class);
                                    i.putExtra("il dato inserito è: ", nomeQuiz);
                                    i.putExtra("La domanda scelta é: ", domanda);
                                    startActivity(i);
                          }
                          if(x==2)
                          {
                                  nomeQuiz = stringsNomeQuiz.get(2);
                                          domanda = stringsTestoQuiz.get(2);
                                  Intent i = new Intent();
                                  i.setClass(MainMenuActivity.this, DatabaseActivity.class);
                            i.putExtra("il dato inserito è: ", nomeQuiz);
                            i.putExtra("La domanda scelta é: ", domanda);
                            startActivity(i);
                          }
                          if(x==3)
                          {
                                  nomeQuiz = stringsNomeQuiz.get(3);
                                           domanda = stringsTestoQuiz.get(3);
                                  Intent i = new Intent();
                                  i.setClass(MainMenuActivity.this, DatabaseActivity.class);
                            i.putExtra("il dato inserito è: ", nomeQuiz);
                            i.putExtra("La domanda scelta é: ", domanda);
                            startActivity(i);
                          }
                          if(x==4)
                          {
                                  nomeQuiz = stringsNomeQuiz.get(4);
                                          domanda = stringsTestoQuiz.get(4);
                                  Intent i = new Intent();
                                  i.setClass(MainMenuActivity.this, DatabaseActivity.class);
                            i.putExtra("il dato inserito è: ", nomeQuiz);
                            i.putExtra("La domanda scelta é: ", domanda);
                            startActivity(i);
                          }

Offline Nicola_D

  • Moderatore
  • Utente storico
  • *****
  • Post: 2479
  • SBAGLIATO!
  • Respect: +323
    • Github
    • Google+
    • nicoladorigatti
    • Mostra profilo
  • Dispositivo Android:
    Nexus 6p, Nexus 4, Nexus S, Nexus 7(2012)
  • Sistema operativo:
    Windows 7
IMPORTANTE:NON RISPONDO A PROBLEMI VIA MESSAGGIO PRIVATO
LOGCAT: Non sai cos'è? -> Android Debug Bridge | Android Developers
               Dov'è in Eclipse? -> Window -> Open Prospective -> DDMS e guarda in basso!
[Obbligatorio] Logcat, questo sconosciuto! (Gruppo AndDev.it LOGTFO) - Android Developers Italia

Offline Andre

  • Utente junior
  • **
  • Post: 62
  • Respect: +1
    • Mostra profilo
Re:Crash onItemClick
« Risposta #2 il: 14 Giugno 2011, 23:57:50 CEST »
0
Codice: [Seleziona]
06-14 21:54:28.607: ERROR/AndroidRuntime(277): FATAL EXCEPTION: main
06-14 21:54:28.607: ERROR/AndroidRuntime(277): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.android.quizzle/com.android.quizzle.DatabaseActivity}: java.lang.IndexOutOfBoundsException: Invalid index 2, size is 2
06-14 21:54:28.607: ERROR/AndroidRuntime(277):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2663)
06-14 21:54:28.607: ERROR/AndroidRuntime(277):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2679)
06-14 21:54:28.607: ERROR/AndroidRuntime(277):     at android.app.ActivityThread.access$2300(ActivityThread.java:125)
06-14 21:54:28.607: ERROR/AndroidRuntime(277):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2033)
06-14 21:54:28.607: ERROR/AndroidRuntime(277):     at android.os.Handler.dispatchMessage(Handler.java:99)
06-14 21:54:28.607: ERROR/AndroidRuntime(277):     at android.os.Looper.loop(Looper.java:123)
06-14 21:54:28.607: ERROR/AndroidRuntime(277):     at android.app.ActivityThread.main(ActivityThread.java:4627)
06-14 21:54:28.607: ERROR/AndroidRuntime(277):     at java.lang.reflect.Method.invokeNative(Native Method)
06-14 21:54:28.607: ERROR/AndroidRuntime(277):     at java.lang.reflect.Method.invoke(Method.java:521)
06-14 21:54:28.607: ERROR/AndroidRuntime(277):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
06-14 21:54:28.607: ERROR/AndroidRuntime(277):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
06-14 21:54:28.607: ERROR/AndroidRuntime(277):     at dalvik.system.NativeStart.main(Native Method)
06-14 21:54:28.607: ERROR/AndroidRuntime(277): Caused by: java.lang.IndexOutOfBoundsException: Invalid index 2, size is 2
06-14 21:54:28.607: ERROR/AndroidRuntime(277):     at java.util.ArrayList.throwIndexOutOfBoundsException(ArrayList.java:257)
06-14 21:54:28.607: ERROR/AndroidRuntime(277):     at java.util.ArrayList.get(ArrayList.java:311)
06-14 21:54:28.607: ERROR/AndroidRuntime(277):     at com.android.quizzle.DatabaseActivity.onCreate(DatabaseActivity.java:162)
06-14 21:54:28.607: ERROR/AndroidRuntime(277):     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
06-14 21:54:28.607: ERROR/AndroidRuntime(277):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2627)
06-14 21:54:28.607: ERROR/AndroidRuntime(277):     ... 11 more
06-14 21:54:28.716: WARN/ActivityManager(33):   Force finishing activity com.android.quizzle/.DatabaseActivity
06-14 21:54:28.766: WARN/ActivityManager(33):   Force finishing activity com.android.quizzle/.MainMenuActivity
06-14 21:54:29.769: WARN/ActivityManager(33): Activity pause timeout for HistoryRecord{44007048 com.android.quizzle/.DatabaseActivity}
06-14 21:54:30.156: INFO/ARMAssembler(33): generated scanline__00000077:03515104_00000000_00000000 [ 33 ipp] (47 ins) at [0x2ff7f8:0x2ff8b4] in 1241434 ns
06-14 21:54:37.292: WARN/ActivityManager(33): Launch timeout has expired, giving up wake lock!
06-14 21:54:39.926: WARN/ActivityManager(33): Activity idle timeout for HistoryRecord{43f92910 com.android.quizzle/.login2}
06-14 21:54:45.056: WARN/ActivityManager(33): Activity destroy timeout for HistoryRecord{44021090 com.android.quizzle/.MainMenuActivity}
06-14 21:54:45.056: WARN/ActivityManager(33): Activity destroy timeout for HistoryRecord{44007048 com.android.quizzle/.DatabaseActivity}


Non mi convince quell'invalid index 2, size is 2.
« Ultima modifica: 15 Giugno 2011, 00:02:36 CEST da Andre »

Offline Nicola_D

  • Moderatore
  • Utente storico
  • *****
  • Post: 2479
  • SBAGLIATO!
  • Respect: +323
    • Github
    • Google+
    • nicoladorigatti
    • Mostra profilo
  • Dispositivo Android:
    Nexus 6p, Nexus 4, Nexus S, Nexus 7(2012)
  • Sistema operativo:
    Windows 7
Re:Crash onItemClick
« Risposta #3 il: 15 Giugno 2011, 01:06:44 CEST »
+1
per forza, hai un IndexOutOfBoundException, cioè stai guardando fuori dai limiti di un array!
se guardi bene, ti dice che l'eccezione è qui:
 at com.android.quizzle.DatabaseActivity.onCreate(DatabaseActivity.java:162)
vai a quella riga e risolvi!
IMPORTANTE:NON RISPONDO A PROBLEMI VIA MESSAGGIO PRIVATO
LOGCAT: Non sai cos'è? -> Android Debug Bridge | Android Developers
               Dov'è in Eclipse? -> Window -> Open Prospective -> DDMS e guarda in basso!
[Obbligatorio] Logcat, questo sconosciuto! (Gruppo AndDev.it LOGTFO) - Android Developers Italia

Offline Gigiuz

  • Utente normale
  • ***
  • Post: 187
  • Respect: +23
    • Google+
    • gigiuzzo81
    • Gigiuz81
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy Note III
  • Play Store ID:
    GGXSoft
  • Sistema operativo:
    Windows 7 64bit, OS X (virtualized), Ubuntu
Re:Crash onItemClick
« Risposta #4 il: 15 Giugno 2011, 01:38:54 CEST »
+1
Non mi convince quell'invalid index 2, size is 2.

A parte che molti punti del tuo codice non mi sono chiari, dovresti postare il tuo DatabaseActivity: sembrerebbe che venga richiesto un indice che nell'array incriminato non esiste.
Hai bisogno di implementare un sistema di "codici seriali di sblocco" nella tua applicazione? Dai un'occhiata alla mia libreria: RemoteUnlocker

Offline Andre

  • Utente junior
  • **
  • Post: 62
  • Respect: +1
    • Mostra profilo
Re:Crash onItemClick
« Risposta #5 il: 15 Giugno 2011, 10:23:33 CEST »
0
Ragazzi siete fantastici. Io purtroppo sono una sega in programmazione. Vi ringrazio ho risolto. Era come dicevate voi: praticamente nel DatabaseActivity ho dichiarato un ArrayList che contiene tutte le risposte del db. Nel caso specifico (ovvero position x==1) non avevo domande sufficienti nel db, e passando il retrieval alle Radio andava in indexOutOfBoundException.

Grazie.
Buona giornata a tutti voi.