Autore Topic: problema con ListView personalizzata  (Letto 651 volte)

Offline Trigun

  • Utente normale
  • ***
  • Post: 183
  • Respect: +4
    • Mostra profilo
problema con ListView personalizzata
« il: 06 Maggio 2011, 03:45:38 CEST »
0
ciao
stavo cercando di creare una listview personalizzata dove al posto di vedere il semplice testo volevo mettere una cosa del genere
Codice (XML): [Seleziona]
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout   android:id="@+id/rigaordine"
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent">
        <TextView
                android:id="@+id/nome"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"></TextView>
        <Button
                android:text="-"
                android:id="@+id/sottrai"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"></Button>
        <TextView
                android:id="@+id/quantita"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"></TextView>
        <Button
                android:text="+"
                android:id="@+id/aggiungi"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"></Button>
</LinearLayout>

ora per far questo ho creato una nuova classe ListaAdapter che espande BaseAdapter e ho inserito all'interno questo codice

Codice (Java): [Seleziona]
        private Context context;

        private RigaOrdine[] rigaOrdine;

        public ListinoAdapter(Context context, RigaOrdine[] rigaOrdine) {
                this.context = context;
                this.rigaOrdine = rigaOrdine;
        }

        @Override
        public int getCount() {
                return rigaOrdine.length;
        }

        @Override
        public Object getItem(int position) {
                return rigaOrdine[position];
        }

        @Override
        public long getItemId(int position) {
                return rigaOrdine[position].hashCode();
        }

        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
                TextView nome, quantita;
                LinearLayout layout;
                if (convertView == null) {
                        LayoutInflater inflater = (LayoutInflater) context
                                        .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
                        layout = (LinearLayout) inflater.inflate(R.layout.rigaordine, null);
                } else {
                        layout = (LinearLayout) convertView;
                }
                nome = (TextView) layout.findViewById(R.id.nome);
                quantita = (TextView) layout.findViewById(R.id.quantita);
                nome.setText(rigaOrdine[position].getNome());
                quantita.setText(rigaOrdine[position].getQuantita());
                return layout;
        }

questa roba non so se effettivamente funziona dato che son partito da 1 classe gia fatta e l'ho modificata, ma non ho capito bene come funziona e non sarei in grado di ricrearla da 0 :)
praticamente tutta la roba in getview non so come funziona :)
l'inflater da quello che ho capito dovrebbe creare l'oggetto java partendo dall'xml... solo che il costruttore l'ho copiato pari pari da 1 sito e almeno che nn sia standard allora e' sbagliato :P (o se e' giusto ho avuto molto culo)
inoltre cos'e' che dovrei metter all'interno dell'if e all'esterno? a occhio direi all'interno la roba che rimane salvata e all'esterno quella che deve esser ricalcolata ogni volta... ma ovviamente non so cosa rimane salvato e secondo quali criteri :)

cmq rigaOrdine e' semplicemente un javabean con 2 campi (nome quantita)


ora quando sull'activity principale cerco di usare questo adapter mi crasha l'app ..
Codice (Java): [Seleziona]
ListView lista = (ListView) findViewById(R.id.lista);
                lista.setAdapter(new ListaAdapter(this, rigaOrdini));


stavo seguendo il pdf di puntoinformatico e mi sono fermato mentre tentavo di creare un mio adapter personale per vedere se effettivamente avevo capito qualcosa :) ma visti i risultati pare di no :)
« Ultima modifica: 06 Maggio 2011, 03:51:40 CEST da Trigun »

Offline MarcoDuff

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 1073
  • Respect: +202
    • Google+
    • marcoduff
    • Mostra profilo
    • MarcoDuff's Blog
  • Dispositivo Android:
    Samsung Galaxy Nexus
  • Play Store ID:
    MarcoDuff
  • Sistema operativo:
    Windows 7
Re:problema con ListView personalizzata
« Risposta #1 il: 06 Maggio 2011, 11:45:48 CEST »
0
Guarda e leggiti i commenti di questo esempio: List14.java | Android Developers

Poi dai una lettura a questo: Android: Use the ViewHolder Luke, and Larry, and Curly, and Moe | Screaming Penguin

Se hai problemi posta pure.

Offline Trigun

  • Utente normale
  • ***
  • Post: 183
  • Respect: +4
    • Mostra profilo
Re:problema con ListView personalizzata
« Risposta #2 il: 06 Maggio 2011, 13:33:22 CEST »
0
umm stavo facendo 1 po' di prove con il debugger... ho messo 1 breakpoint dopo  su               
Codice (Java): [Seleziona]
lista.setAdapter(new ListaAdapter(this, rigaOrdini));(ultima riga di codice postata)
ma in realta' non ci arriva mai...
eppure l'xml main e' un banale
Codice (XML): [Seleziona]
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:orientation="vertical"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent">
        <TextView
                android:id="@+id/lista"
                android:layout_width="fill_parent"
                android:layout_height="wrap_content"
                android:text="@string/hello" />
</LinearLayout>

quindi non capisco perche' debba fallire il findview....


*edit mentre postavo...* omg... textview... come e' finito li ? :)

cmq ora dopo 1 po' di modifiche sull'adapter secondo l'esempio list14
ho questo errore
Codice: [Seleziona]
05-06 11:30:22.532: ERROR/AndroidRuntime(627): FATAL EXCEPTION: main
05-06 11:30:22.532: ERROR/AndroidRuntime(627): android.content.res.Resources$NotFoundException: String resource ID #0x2
05-06 11:30:22.532: ERROR/AndroidRuntime(627):     at android.content.res.Resources.getText(Resources.java:201)
05-06 11:30:22.532: ERROR/AndroidRuntime(627):     at android.widget.TextView.setText(TextView.java:2817)
05-06 11:30:22.532: ERROR/AndroidRuntime(627):     at com.work.listino.ListinoAdapter.getView(ListinoAdapter.java:55)
05-06 11:30:22.532: ERROR/AndroidRuntime(627):     at android.widget.AbsListView.obtainView(AbsListView.java:1315)
05-06 11:30:22.532: ERROR/AndroidRuntime(627):     at android.widget.ListView.measureHeightOfChildren(ListView.java:1198)
05-06 11:30:22.532: ERROR/AndroidRuntime(627):     at android.widget.ListView.onMeasure(ListView.java:1109)
05-06 11:30:22.532: ERROR/AndroidRuntime(627):     at android.view.View.measure(View.java:8171)
05-06 11:30:22.532: ERROR/AndroidRuntime(627):     at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:3132)
05-06 11:30:22.532: ERROR/AndroidRuntime(627):     at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1012)
05-06 11:30:22.532: ERROR/AndroidRuntime(627):     at android.widget.LinearLayout.measureVertical(LinearLayout.java:381)
05-06 11:30:22.532: ERROR/AndroidRuntime(627):     at android.widget.LinearLayout.onMeasure(LinearLayout.java:304)
05-06 11:30:22.532: ERROR/AndroidRuntime(627):     at android.view.View.measure(View.java:8171)
05-06 11:30:22.532: ERROR/AndroidRuntime(627):     at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:3132)
05-06 11:30:22.532: ERROR/AndroidRuntime(627):     at android.widget.FrameLayout.onMeasure(FrameLayout.java:245)
05-06 11:30:22.532: ERROR/AndroidRuntime(627):     at android.view.View.measure(View.java:8171)
05-06 11:30:22.532: ERROR/AndroidRuntime(627):     at android.widget.LinearLayout.measureVertical(LinearLayout.java:526)
05-06 11:30:22.532: ERROR/AndroidRuntime(627):     at android.widget.LinearLayout.onMeasure(LinearLayout.java:304)
05-06 11:30:22.532: ERROR/AndroidRuntime(627):     at android.view.View.measure(View.java:8171)
05-06 11:30:22.532: ERROR/AndroidRuntime(627):     at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:3132)
05-06 11:30:22.532: ERROR/AndroidRuntime(627):     at android.widget.FrameLayout.onMeasure(FrameLayout.java:245)
05-06 11:30:22.532: ERROR/AndroidRuntime(627):     at android.view.View.measure(View.java:8171)
05-06 11:30:22.532: ERROR/AndroidRuntime(627):     at android.view.ViewRoot.performTraversals(ViewRoot.java:801)
05-06 11:30:22.532: ERROR/AndroidRuntime(627):     at android.view.ViewRoot.handleMessage(ViewRoot.java:1727)
05-06 11:30:22.532: ERROR/AndroidRuntime(627):     at android.os.Handler.dispatchMessage(Handler.java:99)
05-06 11:30:22.532: ERROR/AndroidRuntime(627):     at android.os.Looper.loop(Looper.java:123)
05-06 11:30:22.532: ERROR/AndroidRuntime(627):     at android.app.ActivityThread.main(ActivityThread.java:4627)
05-06 11:30:22.532: ERROR/AndroidRuntime(627):     at java.lang.reflect.Method.invokeNative(Native Method)
05-06 11:30:22.532: ERROR/AndroidRuntime(627):     at java.lang.reflect.Method.invoke(Method.java:521)
05-06 11:30:22.532: ERROR/AndroidRuntime(627):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
05-06 11:30:22.532: ERROR/AndroidRuntime(627):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
05-06 11:30:22.532: ERROR/AndroidRuntime(627):     at dalvik.system.NativeStart.main(Native Method)

la classe l'ho cambiata in questo modo:
Codice (Java): [Seleziona]
        LayoutInflater inflater;

        private RigaOrdine[] rigaOrdine;

        public ListinoAdapter(Context context, RigaOrdine[] rigaOrdine) {
                inflater = LayoutInflater.from(context);
                this.rigaOrdine = rigaOrdine;
        }

        @Override
        public int getCount() {
                return rigaOrdine.length;
        }

        @Override
        public Object getItem(int position) {
                return rigaOrdine[position];
        }

        @Override
        public long getItemId(int position) {
                return rigaOrdine[position].hashCode();
        }

        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
                ViewHolder layout;
                if (convertView == null) {
                        convertView = inflater.inflate(R.layout.rigaordine, null);
                        layout = new ViewHolder();
                        layout.nome = (TextView) convertView.findViewById(R.id.nome);
                        layout.quantita = (TextView) convertView.findViewById(R.id.quantita);
                        layout.aggiungi = (Button) convertView.findViewById(R.id.aggiungi);
                        layout.sottrai = (Button) convertView.findViewById(R.id.sottrai);
                       
                        convertView.setTag(layout);
                } else {
                        layout = (ViewHolder) convertView.getTag();
                }
                layout.nome.setText(rigaOrdine[position].getNome());
                layout.quantita.setText(rigaOrdine[position].getQuantita());
                return convertView;
        }

}

class ViewHolder {
        TextView nome;
        TextView quantita;
        Button aggiungi;
        Button sottrai;
}

il debug si ferma praticamente dopo il return dell'adapter...

Offline Ricky`

  • Amministratore
  • Utente storico
  • *****
  • Post: 3489
  • Respect: +506
    • Github
    • Google+
    • rciovati
    • Mostra profilo
Re:problema con ListView personalizzata
« Risposta #3 il: 06 Maggio 2011, 13:39:50 CEST »
0
Se getQuantita ritorna un interno l'errore è proprio quello.
Prova a cambiare così:

Codice (Java): [Seleziona]
layout.quantita.setText(String.valueOf(rigaOrdine[position].getQuantita()));
Il metodo setText della TextView ha un overload che accetta un intero che si riferisce alla risorsa da utilizzare come testo, se tu gli passi un intero lui va a cercare la risorsa corrispondente e nel tuo caso non trovandola crasha.
« Ultima modifica: 06 Maggio 2011, 13:44:47 CEST da Ricky` »

Offline Trigun

  • Utente normale
  • ***
  • Post: 183
  • Respect: +4
    • Mostra profilo
Re:problema con ListView personalizzata
« Risposta #4 il: 06 Maggio 2011, 13:59:37 CEST »
0
ah vero ... non avevo pensato al cambio di tipo...

ho semplicemente messo "" + affianco al get ^^

cmq ora funziona tutto :) tnx per l'aiuto

Offline Trigun

  • Utente normale
  • ***
  • Post: 183
  • Respect: +4
    • Mostra profilo
Re:problema con ListView personalizzata
« Risposta #5 il: 06 Maggio 2011, 22:32:44 CEST »
0
ultima domanda abbastanza banale... stavo provando ad allineare i campi in modo che il 1° sia a sinistra e gli altri tutto a destra...
ho provato a metter la gravity degli ultimi 3 elementi con right ma non mi ha dato nessun risultato... ho provato ad inserire un nuovo layout con gravity a destra e sempre nessun risultato...

l'xml a cui sto cercando di far questa cosa e' il primo che ho postato...

da cosa puo' dipendere?