Autore Topic: Passare Array List da Actvity a Widget  (Letto 1646 volte)

Offline homman

  • Nuovo arrivato
  • *
  • Post: 14
  • Respect: 0
    • Mostra profilo
Passare Array List da Actvity a Widget
« il: 25 Ottobre 2010, 13:30:09 CEST »
0
Sto sviluppando un Widget ed ho qualche problema.
Ho una struttura dati che è un ArrayList<Info>  e Info è una classa creata da me utile a memorizzare informazioni che sono stringhe .

In una activity creo questo arraylist , lo riempio di informazioni e inserisco ogni info in una riga di una listview che faccio vedere nella activity.

Quindi ho un widget che deve prendere le informazioni da questo arraylist creato dall'activity.
Diciamo che volevo utilizzando il metodo OnUpdate()  (dal widget ) prelevare informazioni dall array e stamparle sul widget .

con intent.putExtras..... e getExtras non ci riesco .
Avete qualche idea??
spero in una celere risposta :D

Grazie

Offline blackgin

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 1387
  • Respect: +164
    • Google+
    • blackgins
    • blackginsoft
    • Mostra profilo
  • Dispositivo Android:
    Galaxy Nexus
  • Sistema operativo:
    Mac OSX 10.8
Re:Passare Array List da Actvity a Widget
« Risposta #1 il: 25 Ottobre 2010, 13:37:42 CEST »
0
Ho spostato il topic. L'avevi messo nella sezione tutorial.

Postate il LogCat LogCat LogCat LogCat LogCat

Offline Ricky`

  • Amministratore
  • Utente storico
  • *****
  • Post: 3487
  • Respect: +506
    • Github
    • Google+
    • rciovati
    • Mostra profilo
Re:Passare Array List da Actvity a Widget
« Risposta #2 il: 25 Ottobre 2010, 13:44:12 CEST »
0
con intent.putExtras..... e getExtras non ci riesco .

Non riesco non vuol dire niente.

Prima di tutto accertati che la tua classe Info implementi l'interfaccia Serializable (o meglio ancora Parcelable). è una condizione necessaria affinchè tu possa passare il tuo arraylist in un Intent.
Nel caso avrai ulteriori problemi posta l'output del logcat.

Offline homman

  • Nuovo arrivato
  • *
  • Post: 14
  • Respect: 0
    • Mostra profilo
Re:Passare Array List da Actvity a Widget
« Risposta #3 il: 25 Ottobre 2010, 14:07:53 CEST »
0
Si la mia classe la implementa. Posto il LOG

Codice: [Seleziona]
10-25 09:54:29.488: WARN/dalvikvm(2256): threadid=1: thread exiting with uncaught exception (group=0x4001d800)
10-25 09:54:29.568: ERROR/AndroidRuntime(2256): FATAL EXCEPTION: main
10-25 09:54:29.568: ERROR/AndroidRuntime(2256): java.lang.RuntimeException: Unable to start service com.android.andrea.Update@43e4d858 with Intent { act=Update cmp=com.android.andrea/.Update }: java.lang.NullPointerException
10-25 09:54:29.568: ERROR/AndroidRuntime(2256):     at android.app.ActivityThread.handleServiceArgs(ActivityThread.java:3063)
10-25 09:54:29.568: ERROR/AndroidRuntime(2256):     at android.app.ActivityThread.access$3600(ActivityThread.java:125)
10-25 09:54:29.568: ERROR/AndroidRuntime(2256):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2096)
10-25 09:54:29.568: ERROR/AndroidRuntime(2256):     at android.os.Handler.dispatchMessage(Handler.java:99)
10-25 09:54:29.568: ERROR/AndroidRuntime(2256):     at android.os.Looper.loop(Looper.java:123)
10-25 09:54:29.568: ERROR/AndroidRuntime(2256):     at android.app.ActivityThread.main(ActivityThread.java:4627)
10-25 09:54:29.568: ERROR/AndroidRuntime(2256):     at java.lang.reflect.Method.invokeNative(Native Method)
10-25 09:54:29.568: ERROR/AndroidRuntime(2256):     at java.lang.reflect.Method.invoke(Method.java:521)
10-25 09:54:29.568: ERROR/AndroidRuntime(2256):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
10-25 09:54:29.568: ERROR/AndroidRuntime(2256):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
10-25 09:54:29.568: ERROR/AndroidRuntime(2256):     at dalvik.system.NativeStart.main(Native Method)
10-25 09:54:29.568: ERROR/AndroidRuntime(2256): Caused by: java.lang.NullPointerException
10-25 09:54:29.568: ERROR/AndroidRuntime(2256):     at com.android.andrea.Update.SetInfo(Update.java:212)
10-25 09:54:29.568: ERROR/AndroidRuntime(2256):     at com.android.andrea.Update.buildUpdate(Update.java:100)
10-25 09:54:29.568: ERROR/AndroidRuntime(2256):     at com.android.andrea.Update.onStart(Update.java:44)
10-25 09:54:29.568: ERROR/AndroidRuntime(2256):     at android.app.Service.onStartCommand(Service.java:420)
10-25 09:54:29.568: ERROR/AndroidRuntime(2256):     at android.app.ActivityThread.handleServiceArgs(ActivityThread.java:3053)
10-25 09:54:29.568: ERROR/AndroidRuntime(2256):     ... 10 more
« Ultima modifica: 25 Ottobre 2010, 14:10:05 CEST da Ricky`, Reason: usa il tag code per favore »

Offline Ricky`

  • Amministratore
  • Utente storico
  • *****
  • Post: 3487
  • Respect: +506
    • Github
    • Google+
    • rciovati
    • Mostra profilo
Re:Passare Array List da Actvity a Widget
« Risposta #4 il: 25 Ottobre 2010, 14:10:37 CEST »
0
C'è un NUllPointerException, basta capire il perchè viene sollevato, ma questo devi farlo tu che hai davanti il codice.

Offline homman

  • Nuovo arrivato
  • *
  • Post: 14
  • Respect: 0
    • Mostra profilo
Re:Passare Array List da Actvity a Widget
« Risposta #5 il: 25 Ottobre 2010, 14:19:04 CEST »
0
Ti posto un pò di codice.

La classe InfoTraffico :

Codice (Java): [Seleziona]
import java.io.Serializable;
import java.util.Date;


public class InfoTraffico implements Serializable {
       
        /**
         *
         */

        private static final long serialVersionUID = 1L;
        int id ;
        String pr;
        String iniziotratto;
        String finetratto;
        String stato;
        int photoRes;
        String orario;
        Date gg;
       
public InfoTraffico(int id, String pr, String iniziotratto,String finetratto, String stato, int photoRes, String orario) {
        super();
        this.id = id ;
        this.pr = pr ;
        this.iniziotratto = iniziotratto;
        this.finetratto = finetratto;
        this.stato = stato;
        this.photoRes = photoRes;
        this.orario= orario;
       
       
}

public InfoTraffico(int id, String pr,String iniziotratto,String finetratto, String stato, int photoRes, String orario,Date gg) {
        super();
        this.id = id ;
        this.pr = pr ;
        this.iniziotratto = iniziotratto;
        this.finetratto = finetratto;
        this.stato = stato;
        this.photoRes = photoRes;
        this.orario= orario;
        this.gg=gg;
       
       
}

public InfoTraffico(String iniziotratto,String finetratto, String stato) {
        super();
        this.iniziotratto = iniziotratto;
        this.finetratto = finetratto;
        this.stato = stato;
       
}



public String GetOrario(){
        return orario;
}
        public int GetId(){
                return id;
        }
       
        public String GetPr(){
                return pr;
        }
       
        public String GetInizioTratto(){
                return iniziotratto;
        }
       
        public String GetFineTratto(){
                return finetratto;}
       
       
        public String GetStato(){
                return stato;
        }
       
        public int GetPhotoRes() {
                return photoRes;
        }
       

}





Poi ti posto la classe dove lo riempio :
Codice (Java): [Seleziona]
import java.util.Array
List;


public class StrutturaDati {
   
        /**
         *
         */

        ArrayList<InfoTraffico> List ;
       
        public StrutturaDati(){
               
                List = new ArrayList<InfoTraffico>();
        }
       
       
        public ArrayList<InfoTraffico> riempi(){
        InfoTraffico[] elenco = {
                        new InfoTraffico(1, "a", "Uscita 1 " ,"Uscita 3",     "Regolare", R.drawable.creep_5, "10:20"),
                        new InfoTraffico(3, "b", "Uscita 15 ","Uscita 18",    "Rallentato", R.drawable.creep_4, "11:20"),
                        new InfoTraffico(3, "b", "Uscita 19 ","Uscita 20",        "Difficoltoso", R.drawable.creep_3, "12:20"),
                        new InfoTraffico(3, "c", "Uscita 22 ","Uscita 24",    "Code", R.drawable.creep_2, "10:24"),
                        new InfoTraffico(3, "d", "Uscita 27 ","Uscita 28",    "Critico", R.drawable.creep_1, "12:40"),
                        new InfoTraffico(4, "a", "Uscita 30 ","Uscita 32",    "Regolare", R.drawable.creep_5, "9:20"),
                        new InfoTraffico(2, "d", "Uscita 33 ","Uscita 1",     "Critico", R.drawable.creep_1, "15:00")
                        };
                       
        for (int i = 0 ; i< elenco.length ; i++){
                        List.add(elenco[i]);}


                return List;

        }




        }
       
qui invece faccio le altre cosenell activity :


Codice (Java): [Seleziona]
import com.android.andrea.R;
import com.android.andrea.InfoTraffico;
import com.android.andrea.StrutturaDati;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Locale;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ListView;
import android.widget.SimpleAdapter;
import android.speech.tts.TextToSpeech;
import android.speech.tts.TextToSpeech.OnInitListener;

public class Lista extends Activity implements OnInitListener {
       
        /** Called when the activity is first created. */
        private TextToSpeech mTts;
        String textToSpeak;
        int MY_DATA_CHECK_CODE = 0;
        public ArrayList<InfoTraffico> List ;

       
        @Override
        public void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                setContentView(R.layout.list);
                final ListView listView;
               
                StrutturaDati vettoreinfo = new StrutturaDati();
                List= vettoreinfo.riempi();
               
               
                                               
                // Questa è la lista che rappresenta la sorgente dei dati della
                // listview
                // ogni elemento è una mappa(chiave->valore)
       
                final ArrayList<HashMap<String, Object>> data = new ArrayList<HashMap<String, Object>>();

                for (int i = 0; i < List.size(); i++) {
                        InfoTraffico p = List.get(i);// per ogni informazione all'inteno
                                                                                        // della Lista

                        HashMap<String, Object> infoMap = new HashMap<String, Object>();// creiamo
                                                                                                                                                        // una
                                                                                                                                                        // mappa
                                                                                                                                                        // di
                                                                                                                                                        // valori

                        infoMap.put("image", p.GetPhotoRes()); // per la chiave image,
                                                                                                        // inseriamo la risorsa dell
                                                                                                        // immagine
                        infoMap.put( "itratto", p.GetInizioTratto()); // per la chiave
                                                                                                        // tratto,l'informazine sul
                                                                                                        // tratto iniziale
                        infoMap.put("ftratto", p.GetFineTratto()); // per la chiave
                                                                                                                // tratto,l'informazine sul
                                                                                                                // tratto finale
                       
                        infoMap.put("stato", p.GetStato());// per la chiave stato,
                                                                                                // l'informazione sullo Stato
                        infoMap.put("ora", p.GetOrario());
                        data.add(infoMap); // aggiungiamo la mappa di valori alla sorgente
                                                                // dati
                }

                final String[] from = { "image","itratto","ftratto", "stato", "ora" }; // dai valori
                                                                                                                                // contenuti in
                                                                                                                                // queste chiavi
                final int[] to = { R.id.Image, R.id.InizioTratto,R.id.FineTratto,   R.id.Stato,
                                R.id.orario };// agli id dei layout

               
                // costruzione dell adapter
               
               
       
               
                SimpleAdapter adapter = new SimpleAdapter(getApplicationContext(),
                                data,// sorgente dati
                                R.layout.appwidget_provider_layout, // layout contenente gli id di "to"
                                from, to);

                // utilizzo dell'adapter
                listView = (ListView) findViewById(R.id.infoListView);

                listView.setAdapter(adapter);  
               
               
               
                //Modo per esportare Array in un altra Classe
            Intent intent=new Intent(getApplicationContext(),Widget.class);
                intent.putExtra("esporta", List);
               
               
               
                Log.e("push", Integer.toString(adapter.getCount()));
                Log.e("push", Integer.toString(listView.getCheckedItemPosition()));

               
               
               
               
                listView.setOnItemClickListener(new OnItemClickListener() {
                        public void onItemClick(AdapterView<?> parent, View v, int position, long id) {

                                                                       
                                        InfoTraffico a = List.get(position);//position indica dove avviene il click
                                        String b = "Il traffico tra l'"+a.GetInizioTratto()+ " e l'" + a.GetFineTratto() + " è " + a.GetStato();
                                        speak(b);
               
                                       
                                }

                       
                });
               
               
                               
                Intent checkIntent = new Intent();
                checkIntent.setAction(TextToSpeech.Engine.ACTION_CHECK_TTS_DATA);
                startActivityForResult(checkIntent, MY_DATA_CHECK_CODE);
                mTts = new TextToSpeech(this, (OnInitListener) this);
               
        }

       
       
        public void speak(String textToSpeak) {
                mTts.setLanguage(Locale.ITALIAN);
                mTts.speak(textToSpeak, TextToSpeech.QUEUE_FLUSH, null);
        }

        public void onInit(int arg0) {}
e qui invece  cerco di recuperare le informazioni :
Codice (Java): [Seleziona]
        public RemoteViews SetInfo(RemoteViews views){
       
                // creo l'intent per prendere info dall Lista activity

                        Intent i = new Intent(this, Lista.class);
                       ArrayList<InfoTraffico> List = (ArrayList<InfoTraffico>)i.getSerializableExtra("List");
       
                StrutturaDati vettoreinfo = new StrutturaDati();
                ArrayList<InfoTraffico> List  = vettoreinfo.riempi();
                       
                                InfoTraffico a = List.get(4);
                        String stato = a.GetStato();
                        String itratto = a.GetInizioTratto();
                        String ftratto = a.GetFineTratto();
                        String orario = a.GetOrario();
                               
                       
                        views.setTextViewText(R.id.location, "No Info");
                        views.setTextViewText(R.id.ora, orario);
                        views.setTextViewText(R.id.conditions, stato);
                        views.setTextViewText(R.id.tra, "tra");
                        views.setTextViewText(R.id.high, itratto);
                            views.setTextViewText(R.id.low, ftratto);
                            views.setImageViewResource(R.id.icon, SelezioneIcona(stato));
                           
                           
                           
                            return views;
}



       


   
« Ultima modifica: 25 Ottobre 2010, 14:31:24 CEST da homman »

Offline homman

  • Nuovo arrivato
  • *
  • Post: 14
  • Respect: 0
    • Mostra profilo
Re:Passare Array List da Actvity a Widget
« Risposta #6 il: 25 Ottobre 2010, 14:20:59 CEST »
0
Scusami per come ti ho postato il codice ma non sò come si fà a postarlo in maniera corretta........
E' venuto un casino. ...... xD
Cmq pero tu abbia capito la struttura del progetto.
Dove sbaglio????

Offline Ricky`

  • Amministratore
  • Utente storico
  • *****
  • Post: 3487
  • Respect: +506
    • Github
    • Google+
    • rciovati
    • Mostra profilo
Re:Passare Array List da Actvity a Widget
« Risposta #7 il: 25 Ottobre 2010, 14:26:17 CEST »
0
Devi usare l'apposito tag
Correggi per favore.

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:Passare Array List da Actvity a Widget
« Risposta #8 il: 25 Ottobre 2010, 16:17:01 CEST »
0
il logcat riporta il nullPointer quì:

....SetInfo(Update.java:212)

vedi cosa c'è nella riga 212, che noi non abbiamo i numeri di riga...
lì c'è qualcosa a null. Verifica cosa possa essere e perché.
7h38ugg3r<=>thebugger
Non conosci Java? Allora sei nel posto sbagliato!

http://www.androidpatterns.com/

Offline Sirio22

  • Utente junior
  • **
  • Post: 93
  • Respect: +2
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy S2
  • Sistema operativo:
    Windows 7/8.1
Re:Passare Array List da Actvity a Widget
« Risposta #9 il: 26 Ottobre 2010, 01:59:50 CEST »
0
Codice (Java): [Seleziona]
      ArrayList<InfoTraffico> List  = vettoreinfo.riempi();
                        InfoTraffico a = List.get(4);
                        String stato = a.GetStato();

vettoreinfo è stato creato?
In posizione 4 di List c'è un elemento ?
Let Your Brain Run Away

Offline homman

  • Nuovo arrivato
  • *
  • Post: 14
  • Respect: 0
    • Mostra profilo
Re:Passare Array List da Actvity a Widget
« Risposta #10 il: 26 Ottobre 2010, 10:33:06 CEST »
0
Così creo la struttura e la popolo in Lista.java :

Codice (Java): [Seleziona]
@Override
        public void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                setContentView(R.layout.list);
                final ListView listView;
               
                StrutturaDati vettoreinfo = new StrutturaDati();
                List= vettoreinfo.riempi();
               



I metodi che utilizzo sono questi:

Codice (Java): [Seleziona]
public class StrutturaDati {
   
        /**
         *
         */

        ArrayList<InfoTraffico> List ;
       
        public StrutturaDati(){
               
                List = new ArrayList<InfoTraffico>();
        }
       
       
        public ArrayList<InfoTraffico> riempi(){
        InfoTraffico[] elenco = {
                        new InfoTraffico(1, "a", "Uscita 1 " ,"Uscita 3",     "Regolare", R.drawable.creep_5, "10:20"),
                        new InfoTraffico(3, "b", "Uscita 15 ","Uscita 18",    "Rallentato", R.drawable.creep_4, "11:20"),
                        new InfoTraffico(3, "b", "Uscita 19 ","Uscita 20",        "Difficoltoso", R.drawable.creep_3, "12:20"),
                        new InfoTraffico(3, "c", "Uscita 22 ","Uscita 24",    "Code", R.drawable.creep_2, "10:24"),
                        new InfoTraffico(3, "d", "Uscita 27 ","Uscita 28",    "Critico", R.drawable.creep_1, "12:40"),
                        new InfoTraffico(4, "a", "Uscita 30 ","Uscita 32",    "Regolare", R.drawable.creep_5, "9:20"),
                        new InfoTraffico(2, "d", "Uscita 33 ","Uscita 1",     "Critico", R.drawable.creep_1, "15:00")
                        };
                       
        for (int i = 0 ; i< elenco.length ; i++){
                        List.add(elenco[i]);}


                return List;

        }
:
ma mi dà null pointer exception in corrispondenza del metodo SetInfo esattamento dove richiamo getSerializable()   nella classe update.java:

Codice (Java): [Seleziona]
public RemoteViews SetInfo(RemoteViews views){
       
                // creo l'intent per prendere info dall Lista activity

                        Intent i = new Intent(this, Lista.class);
                       ArrayList<InfoTraffico> List = (ArrayList<InfoTraffico>)i.getSerializableExtra("esporta"");
e glielo passo così da un altra classe  Lista.class
Codice (Java): [Seleziona]
 //Modo per esportare Array in un altra Classe
            Intent intent=new Intent(getApplicationContext(),update.class);
                intent.putExtra("esporta", List);

Offline Ricky`

  • Amministratore
  • Utente storico
  • *****
  • Post: 3487
  • Respect: +506
    • Github
    • Google+
    • rciovati
    • Mostra profilo
Re:Passare Array List da Actvity a Widget
« Risposta #11 il: 26 Ottobre 2010, 10:41:14 CEST »
0
Prova a cambiare
Codice (Java): [Seleziona]
   Intent i = new Intent(this, Lista.class);
con

Codice (Java): [Seleziona]
   Intent i = getIntent();

Offline homman

  • Nuovo arrivato
  • *
  • Post: 14
  • Respect: 0
    • Mostra profilo
Re:Passare Array List da Actvity a Widget
« Risposta #12 il: 26 Ottobre 2010, 14:59:30 CEST »
0
Essendo dentro ad un metodo , mi dice che getIntent() non esiste come metodo quindi non lo posso usare e devo cambiare la struttura delle classi.


Altri suggerimenti....

Offline Ricky`

  • Amministratore
  • Utente storico
  • *****
  • Post: 3487
  • Respect: +506
    • Github
    • Google+
    • rciovati
    • Mostra profilo
Re:Passare Array List da Actvity a Widget
« Risposta #13 il: 26 Ottobre 2010, 15:16:38 CEST »
0
Se tu devi andare a prendere dei parametri che sono stati passati nel momento che hai startato l'activity l'unico modo è quello.

Offline homman

  • Nuovo arrivato
  • *
  • Post: 14
  • Respect: 0
    • Mostra profilo
Re:Passare Array List da Actvity a Widget
« Risposta #14 il: 26 Ottobre 2010, 19:43:05 CEST »
0
ci sono riuscito creando una nuova classe che implementa Activty  e mettendo l'istruzione che mi dava problema.

Ho un quesito:

Ma se le informazioni le volessi passare ad un widget e non ad una Activity come devo fare?

Il mio problema iniziale era dato proprio da questo, in quanto io ho bisogno delle informazioni dell arrayList all interno del metodo onupdate() del widget e non in una nuova activity.

Come si può fare?

Grazie a tutti per le rispote celeri :D