Autore Topic: crash dopo click su item di gridView  (Letto 557 volte)

Offline N4tty

  • Nuovo arrivato
  • *
  • Post: 13
  • Respect: 0
    • Mostra profilo
    • While(1) QI++;
  • Sistema operativo:
    ArchLinux
crash dopo click su item di gridView
« il: 24 Aprile 2012, 23:11:58 CEST »
0
Premetto che sono pochissimi giorni che mi sto guardando le API android, e forum come questo mi stanno dando una grande mano nel cominciare a capire i concetti fondamentali, ho un errore sicuramente banale durante un click su di un item di una gridView.
Quello che voglio fare io sarebbero due gridView, una in alto vuota e una in basso con delle textView dentro, cui con il click su di un elemento textView viene rimossa la textView e creata nel gridView in alto. Vi posto un po' di codice sperando mi possiate dare una mano.

Il layout xml è:

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" >
   
    <GridView android:id="@+id/tavolo"
       android:layout_width="fill_parent"
       android:layout_height="fill_parent"
       android:layout_weight="1"
       android:orientation="horizontal"
       android:gravity="center"
       android:numColumns="2" >
       
    </GridView>
   
    <GridView android:id="@+id/cartePlayer"
       android:layout_width="fill_parent"
       android:layout_height="fill_parent"
       android:layout_weight="1"
       android:orientation="horizontal"
       android:gravity="center" >
       
    </GridView>
   
</LinearLayout>

il layout con le textview (che è lo stesso sia per il gridView in alto che quello in basso):

Codice (XML): [Seleziona]
<?xml version="1.0" encoding="UTF-8"?>

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
   android:layout_height="fill_parent"
   android:layout_width="fill_parent" >
   
    <TextView android:id="@+id/carta"
       android:layout_height="fill_parent"
        android:layout_width="fill_parent"
        android:text="nome carta" />
   
</RelativeLayout>

l'activity in questione è:

Codice (Java): [Seleziona]
import java.util.ArrayList;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ArrayAdapter;
import android.widget.GridView;
import android.widget.TextView;

public class Tre7StartPlay extends Activity implements OnItemClickListener {
       
        /** attributi core gioco */
        private Mazzo mazzo;
        private Giocatore player;
        private Cpu computer;
       
        /** attributi sincronizzatori tra liste e bottoni */
        private ArrayList<String> mArrayCard, mArrayTavolo;
        private ArrayAdapter<String> mArrayCardAdapter, mArrayTavoloAdapter;
       
        public void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                setContentView(R.layout.match);
               
                player = new Giocatore("pippo");
                computer = new Cpu(2);
                mazzo = new Mazzo(player, computer);
                GridView carteATavolo = (GridView) findViewById(R.id.tavolo);
                GridView list = (GridView) findViewById(R.id.cartePlayer);
               
                mArrayCard = new ArrayList<String>();
                for(int i=0;i<10;i++) mArrayCard.add(player.carteInMano.get(i).getName());
                mArrayCardAdapter = new ArrayAdapter<String>(this, R.layout.cards, R.id.carta, mArrayCard);
                list.setAdapter(mArrayCardAdapter);
                list.setOnItemClickListener(this);
               
                mArrayTavolo = new ArrayList<String>();
                mArrayTavoloAdapter = new ArrayAdapter<String>(this, R.layout.cards, R.id.carta, mArrayTavolo);
                carteATavolo.setAdapter(mArrayTavoloAdapter);
        }

        public void onItemClick(AdapterView<?> adapter, View v, int position, long id) {
                // TODO Auto-generated method stub
               
                String          nomeCarta = ((TextView) v).getText().toString();
                String[]        infoCarta = nomeCarta.split(" ");
                int[]           identifier = { 0, 0 };
                Carta           cartaP, cartaC;
               
               
                /** calcolo id carta e carta risposta del cpu */
                if(infoCarta[0].equals("quattro")) identifier[0] = 0;
                if(infoCarta[0].equals("cinque")) identifier[0] = 1;
                if(infoCarta[0].equals("sei")) identifier[0] = 2;
                if(infoCarta[0].equals("sette")) identifier[0] = 3;
                if(infoCarta[0].equals("fante")) identifier[0] = 4;
                if(infoCarta[0].equals("cavallo")) identifier[0] = 5;
                if(infoCarta[0].equals("re")) identifier[0] = 6;
                if(infoCarta[0].equals("asso")) identifier[0] = 7;
                if(infoCarta[0].equals("due")) identifier[0] = 8;
                if(infoCarta[0].equals("tre")) identifier[0] = 9;
               
                if(infoCarta[2].equals("denari")) identifier[1] = 0;
                if(infoCarta[2].equals("bastoni")) identifier[1] = 1;
                if(infoCarta[2].equals("coppe")) identifier[1] = 2;
                if(infoCarta[2].equals("spade")) identifier[1] = 3;
               
                cartaP = new Carta(identifier[1]*10+identifier[0]);
                cartaC = computer.rispondi(cartaP);
                player.tiraCarta(cartaP);
                computer.tiraCarta(cartaC);
               
                /** aggiorno carte e grid view tavolo */
                mArrayTavolo.clear();
                mArrayTavolo.add(cartaP.getName());
                mArrayTavolo.add(cartaC.getName());
                mArrayTavoloAdapter.notifyDataSetChanged();

                /** aggiorno carte utente e list view con le carte */
                mArrayCard.remove(cartaP.getName());
                mArrayCard.add(mazzo.assegnaCarte(player, 1).getName());
                mArrayCardAdapter.notifyDataSetChanged();
        }
       
}

il maledetto logCat (di cui non riesco a capire molto) è:

04-25 00:56:42.092: I/System.out(980): debugger has settled (1495)
04-25 00:57:44.059: D/AndroidRuntime(980): Shutting down VM
04-25 00:57:44.059: W/dalvikvm(980): threadid=3: thread exiting with uncaught exception (group=0x4001b188)
04-25 00:57:44.062: E/AndroidRuntime(980): Uncaught handler: thread main exiting due to uncaught exception
04-25 00:57:44.142: E/AndroidRuntime(980): java.lang.ClassCastException: android.widget.RelativeLayout
04-25 00:57:44.142: E/AndroidRuntime(980):    at n4tty.tre.sette.Tre7StartPlay.onItemClick(Tre7StartPlay.java:49)
04-25 00:57:44.142: E/AndroidRuntime(980):    at android.widget.AdapterView.performItemClick(AdapterView.java:284)
04-25 00:57:44.142: E/AndroidRuntime(980):    at android.widget.AbsListView$PerformClick.run(AbsListView.java:1640)
04-25 00:57:44.142: E/AndroidRuntime(980):    at android.os.Handler.handleCallback(Handler.java:587)
04-25 00:57:44.142: E/AndroidRuntime(980):    at android.os.Handler.dispatchMessage(Handler.java:92)
04-25 00:57:44.142: E/AndroidRuntime(980):    at android.os.Looper.loop(Looper.java:123)
04-25 00:57:44.142: E/AndroidRuntime(980):    at android.app.ActivityThread.main(ActivityThread.java:4363)
04-25 00:57:44.142: E/AndroidRuntime(980):    at java.lang.reflect.Method.invokeNative(Native Method)
04-25 00:57:44.142: E/AndroidRuntime(980):    at java.lang.reflect.Method.invoke(Method.java:521)
04-25 00:57:44.142: E/AndroidRuntime(980):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:860)
04-25 00:57:44.142: E/AndroidRuntime(980):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618)
04-25 00:57:44.142: E/AndroidRuntime(980):    at dalvik.system.NativeStart.main(Native Method)
04-25 00:57:44.212: I/dalvikvm(980): threadid=7: reacting to signal 3
04-25 00:57:44.212: E/dalvikvm(980): Unable to open stack trace file '/data/anr/traces.txt': Permission denied
04-25 00:57:58.659: W/jdwp(980): Debugger is telling the VM to exit with code=1
04-25 00:57:58.659: I/dalvikvm(980): GC lifetime allocation: 2511 bytes


Se vi servono altre informazioni fatemi sapere, intanto grazie!!
WE ARE NOT HERE TO JUDGE WHAT'S GOOD FROM BAD, BUT TO DO THE THING THAT ARE RIGHT

Offline zaxxon

  • Nuovo arrivato
  • *
  • Post: 34
  • Respect: +4
    • Mostra profilo
  • Dispositivo Android:
    Archos 101 G9
  • Sistema operativo:
    Ubuntu 10.04
Re:crash dopo click su item di gridView
« Risposta #1 il: 25 Aprile 2012, 09:56:04 CEST »
0
Trattandosi di una ClassCastException direi che la riga incriminata è:

Codice (Java): [Seleziona]
String          nomeCarta = ((TextView) v).getText().toString();
contandole non sembra la riga 49, ma forse copiando il testo qualcosa si è sballato.

Sei sicuro che la View passata al listener sia l'elemento della griglia e non la griglia stessa?

Probabilmente ti viene passata la GridView che genera l'evento e con i valori di position e id devi ricavarti l'elemento cliccato.

Offline N4tty

  • Nuovo arrivato
  • *
  • Post: 13
  • Respect: 0
    • Mostra profilo
    • While(1) QI++;
  • Sistema operativo:
    ArchLinux
Re:crash dopo click su item di gridView
« Risposta #2 il: 25 Aprile 2012, 12:25:46 CEST »
0
Hai pienamente ragione, l'adapter è settato ovviamente alla gridView, mi è bastato ricavare la textView e ho risolto! Grazie!
Magari a qualcuno può servire, per ricavare il testo della textView cliccata la prendo direttamente dall'arrayList precedente con cui ho popolato la gridView.
faccio:
Codice (Java): [Seleziona]
public void onItemClick(AdapterView<?> adapter, View v, int position, long id) {
                // TODO Auto-generated method stub
               
                String          nomeCarta = mArrayCard.get((int)id);
.
.
.
WE ARE NOT HERE TO JUDGE WHAT'S GOOD FROM BAD, BUT TO DO THE THING THAT ARE RIGHT