Autore Topic: problema passaggio arraylist con Parcelable  (Letto 896 volte)

Offline gbu123

  • Utente junior
  • **
  • Post: 74
  • Respect: +2
    • Mostra profilo
  • Sistema operativo:
    windows 7
problema passaggio arraylist con Parcelable
« il: 20 Agosto 2012, 15:29:47 CEST »
0
ciao
chiedo scusa , sono nuovo dell'argomento , devo fare questa activity :
un'attività principale prepara un arraylist di oggetti , ogni oggetto ha 3 campi String (ma potrebbe essere un oggetto qualunque)
poi deve passare questo array ad un'attività secondaria , la quale visualizza i dati su una listview ;
vorrei usare il metodo Parcelable perchè ho capito che è quello meno pesante ;
ho cercato sui vari siti , però non sono riuscito a far funzionare un bel niente , l'activity principale fa questa chiamata :

public void chiama(View v) {

        Intent intchiama = new Intent(MainActivity.this, ListaVociNewAct.class);
        intchiama.putParcelableArrayListExtra("listNegozi",listNegozi);
        MainActivity.this.startActivity(intchiama);

    }


l'activity secondaria fa queste operazioni :

public class ListaVociNewAct extends Activity {
   
    protected Context mContext;
    private ListView listav ;
    private ArrayAdapter<Negozio> listAdapt ;
    private ArrayList<Negozio> listNegozi;
   
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.listavocinew );
        mContext = this;
       
        Intent intchiama = getIntent();
         listNegozi = intchiama.getParcelableArrayList("listNegozi");
       
         // Find the ListView resource.         
        listav = (ListView) findViewById(R.id.listavocinew);

        // Create ArrayAdapter using the planet list. 
        listAdapt = new ArrayAdapter<Negozio>(this, R.layout.rigasemplicenew, listNegozi); 
       
        // Set the ArrayAdapter as the ListView's adapter. 
        listav.setAdapter( listAdapt );           

       }

}

il layout rigasemplicenew è la riga che viene carica sulla listview ;

per favore potete aiutarmi o dirmi dove trovare un buon esempio ?
scusate ma forse sono troppo ignorate
grazie
ciao
 

Offline bradipao

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 4043
  • keep it simple
  • Respect: +567
    • Github
    • Google+
    • bradipao
    • Mostra profilo
  • Dispositivo Android:
    Nexus 5
  • Play Store ID:
    Bradipao
  • Sistema operativo:
    W7
Re:problema passaggio arraylist con Parcelable
« Risposta #1 il: 20 Agosto 2012, 15:49:18 CEST »
0
Qual'è di preciso il problema? Puoi postare Logcat di errori?
NON rispondo a domande nei messaggi privati
Bradipao @ Play Store

Offline gbu123

  • Utente junior
  • **
  • Post: 74
  • Respect: +2
    • Mostra profilo
  • Sistema operativo:
    windows 7
Re:problema passaggio arraylist con Parcelable
« Risposta #2 il: 21 Agosto 2012, 10:40:20 CEST »
0
Grazie

cerco di essere il più chiaro e completo possibile :

l'activity main (MainActivity) fa queste operazioni (mostro solo le istruzioni importanti) :

    private ArrayList<Negozio> listNegozi;

    @Override
    public void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.activity_main);
     
    // carica un array
      prepara();
     

    private void prepara() {
       listNegozi = new ArrayList<Negozio>();
       listNegozi.add(new Negozio(1,"Bar da Mario", "Vicolo delle sorprese"));       
       listNegozi.add(new Negozio(2,"Bar da Gigi", "Vicolo delle cerbiatte"));
       listNegozi.add(new Negozio(3,"Bar da BuzziBuzzi", "Vicolo delle sorpresone"));
       listNegozi.add(new Negozio(4,"Bar da Budda", "Vicolo stretto"));
       listNegozi.add(new Negozio(5,"Buddabar", "Vicolo corto"));
       listNegozi.add(new Negozio(6,"Bar da Bar", "Vicolo dritto"));

    // il bottone sull'XML riporta :  android:onClick="chiama"/>
    public void chiama(View v) {
        Intent intchiama = new Intent(MainActivity.this, ListaVociNewAct.class);
        intchiama.putParcelableArrayListExtra("listNegozi",listNegozi);
        //intchiama.putParcelableArrayListExtra("listNegozi",listNegozi);
        MainActivity.this.startActivity(intchiama);
    }



l'activity chiamata è ListaVociNewAct.java , deve preparare una listview con i dati dell'arraylist , usando la struttura rigasemplicenew.xml ; è così fatta  :

import java.util.ArrayList;

import android.os.Bundle;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.view.Menu;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.TextView;

public class ListaVociNewAct extends Activity {
   
    protected Context mContext;
    private ListView listav ;
    private ArrayAdapter<Negozio> listAdapt ;
    private ArrayList<Negozio> listNegozi;
   
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.listavocinew );
        mContext = this;
       
        Intent intchiama = getIntent();
        listNegozi = intchiama.getParcelableArrayListExtra("listNegozi");
       
           // Find the ListView resource.         
        listav = (ListView) findViewById(R.id.listavocinew);

      // Create ArrayAdapter using the planet list. 
        listAdapt = new ArrayAdapter<Negozio>(this, R.layout.rigasemplicenew,
                    listNegozi); 
       
        // Set the ArrayAdapter as the ListView's adapter. 
        listav.setAdapter( listAdapt );           

       }
}



ho poi definito la classe Parcelable :

package com.example.pippo;

import android.os.Parcel;
import android.os.Parcelable;

public class Negozio implements Parcelable
{

       private int id1;
      private String insegna1;
      private String indirizzo1;
      
      //public Negozio(String insegna, String indirizzo)
      public Negozio(int id, String insegna, String indirizzo)
      {
         this.id1 = id;
         this.insegna1 = insegna;
         this.indirizzo1 = indirizzo;
      }
      
      public Negozio (Parcel p)
      {
         this.id1 = p.readInt();
         this.insegna1 = p.readString();
         this.indirizzo1 = p.readString();
      }

      //@Override
      public int describeContents()
      {
         // TODO Auto-generated method stub
         return 0;
      }
   
      public void writeToParcel(Parcel p, int flags)
      {
         p.writeInt(id1);
         p.writeString(insegna1);
         p.writeString(indirizzo1);    
      }
      
      public static final Parcelable.Creator CREATOR = new Parcelable.Creator()
      {
            public Negozio createFromParcel(Parcel in)
            {
            return new Negozio(in);
            }
            public Negozio[] newArray(int size)
            {
            return new Negozio[size];
            }
       };
   
}


il log di esecuzione mi da questi messaggi :

08-21 07:45:38.669: D/gralloc_goldfish(553): Emulator without GPU emulation detected.
08-21 07:50:19.428: E/ArrayAdapter(553): You must supply a resource ID for a TextView
08-21 07:50:19.428: D/AndroidRuntime(553): Shutting down VM
08-21 07:50:19.438: W/dalvikvm(553): threadid=1: thread exiting with uncaught exception (group=0x409c01f8)
08-21 07:50:19.548: E/AndroidRuntime(553): FATAL EXCEPTION: main
08-21 07:50:19.548: E/AndroidRuntime(553): java.lang.IllegalStateException: ArrayAdapter requires the resource ID to be a TextView
08-21 07:50:19.548: E/AndroidRuntime(553):    at android.widget.ArrayAdapter.createViewFromResource(ArrayAdapter.java:386)
08-21 07:50:19.548: E/AndroidRuntime(553):    at android.widget.ArrayAdapter.getView(ArrayAdapter.java:362)
08-21 07:50:19.548: E/AndroidRuntime(553):    at android.widget.AbsListView.obtainView(AbsListView.java:2033)
08-21 07:50:19.548: E/AndroidRuntime(553):    at android.widget.ListView.measureHeightOfChildren(ListView.java:1244)
08-21 07:50:19.548: E/AndroidRuntime(553):    at android.widget.ListView.onMeasure(ListView.java:1155)
08-21 07:50:19.548: E/AndroidRuntime(553):    at android.view.View.measure(View.java:12723)
08-21 07:50:19.548: E/AndroidRuntime(553):    at android.widget.RelativeLayout.measureChild(RelativeLayout.java:579)
08-21 07:50:19.548: E/AndroidRuntime(553):    at android.widget.RelativeLayout.onMeasure(RelativeLayout.java:392)
08-21 07:50:19.548: E/AndroidRuntime(553):    at android.view.View.measure(View.java:12723)
08-21 07:50:19.548: E/AndroidRuntime(553):    at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4698)
08-21 07:50:19.548: E/AndroidRuntime(553):    at android.widget.FrameLayout.onMeasure(FrameLayout.java:293)
08-21 07:50:19.548: E/AndroidRuntime(553):    at android.view.View.measure(View.java:12723)
08-21 07:50:19.548: E/AndroidRuntime(553):    at android.widget.LinearLayout.measureVertical(LinearLayout.java:812)
08-21 07:50:19.548: E/AndroidRuntime(553):    at android.widget.LinearLayout.onMeasure(LinearLayout.java:553)
08-21 07:50:19.548: E/AndroidRuntime(553):    at android.view.View.measure(View.java:12723)
08-21 07:50:19.548: E/AndroidRuntime(553):    at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4698)
08-21 07:50:19.548: E/AndroidRuntime(553):    at android.widget.FrameLayout.onMeasure(FrameLayout.java:293)
08-21 07:50:19.548: E/AndroidRuntime(553):    at com.android.internal.policy.impl.PhoneWindow$DecorView.onMeasure(PhoneWindow.java:2092)
08-21 07:50:19.548: E/AndroidRuntime(553):    at android.view.View.measure(View.java:12723)
08-21 07:50:19.548: E/AndroidRuntime(553):    at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1064)
08-21 07:50:19.548: E/AndroidRuntime(553):    at android.view.ViewRootImpl.handleMessage(ViewRootImpl.java:2442)
08-21 07:50:19.548: E/AndroidRuntime(553):    at android.os.Handler.dispatchMessage(Handler.java:99)
08-21 07:50:19.548: E/AndroidRuntime(553):    at android.os.Looper.loop(Looper.java:137)
08-21 07:50:19.548: E/AndroidRuntime(553):    at android.app.ActivityThread.main(ActivityThread.java:4424)
08-21 07:50:19.548: E/AndroidRuntime(553):    at java.lang.reflect.Method.invokeNative(Native Method)
08-21 07:50:19.548: E/AndroidRuntime(553):    at java.lang.reflect.Method.invoke(Method.java:511)
08-21 07:50:19.548: E/AndroidRuntime(553):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
08-21 07:50:19.548: E/AndroidRuntime(553):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
08-21 07:50:19.548: E/AndroidRuntime(553):    at dalvik.system.NativeStart.main(Native Method)
08-21 07:50:19.548: E/AndroidRuntime(553): Caused by: java.lang.ClassCastException: android.widget.LinearLayout cannot be cast to android.widget.TextView
08-21 07:50:19.548: E/AndroidRuntime(553):    at android.widget.ArrayAdapter.createViewFromResource(ArrayAdapter.java:379)
08-21 07:50:19.548: E/AndroidRuntime(553):    ... 28 more
08-21 07:50:19.788: I/dalvikvm(553): threadid=3: reacting to signal 3

Offline bradipao

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 4043
  • keep it simple
  • Respect: +567
    • Github
    • Google+
    • bradipao
    • Mostra profilo
  • Dispositivo Android:
    Nexus 5
  • Play Store ID:
    Bradipao
  • Sistema operativo:
    W7
Re:problema passaggio arraylist con Parcelable
« Risposta #3 il: 21 Agosto 2012, 10:50:57 CEST »
0
Da quello che leggo capisco questo:

La causa è evidenziata dalla riga del logcat che inizia con caused by

Citazione
08-21 07:50:19.548: E/AndroidRuntime(553): Caused by: java.lang.ClassCastException: android.widget.LinearLayout cannot be cast to android.widget.TextView

Passando al codice si vede che tu usi un ArrayAdapter, aprendo la documentazione ufficiale ( ArrayAdapter | Android Developers ) la prima riga di descrizione dice che ArrayAdapter si aspetta di essere legato ad una singola TextView:

Citazione
By default this class expects that the provided resource id references a single TextView. If you want to use a more complex layout, use the constructors that also takes a field id. That field id should reference a TextView in the larger layout resource.

Quindi penso che il problema sia proprio la scelta dell'adapter, non adatto a quello che credo tu voglia ottenere. Guarda questo tutorial per vedere se fa al caso tuo: [medio] ListView con layout personalizzato tramite un SimpleAdapter - Android Developers Italia
NON rispondo a domande nei messaggi privati
Bradipao @ Play Store