Autore Topic: gestire ImageView all'interno di GridView  (Letto 958 volte)

Offline N4tty

  • Nuovo arrivato
  • *
  • Post: 13
  • Respect: 0
    • Mostra profilo
    • While(1) QI++;
  • Sistema operativo:
    ArchLinux
gestire ImageView all'interno di GridView
« il: 29 Aprile 2012, 15:41:45 CEST »
0
Premetto che non sono sicuro sia la sezione più giusta, btw mi servirebbe un consiglio.
Devo gestire dinamicamente delle immagini che appaiono e scompaiono all'interno di gridView, l'unico problema è che ogni immagine dovrebbe essere identificata da un id/nome di modo da poter ricavale le informazioni sull'immagine cliccata.
Provo a spiegarmi meglio, sto codando un gioco di carte; per ora io ho delle textView che fungono da  carte e riesco a mostrarle ed utilizzarle correttamente ai fini del gioco, con un semplice getText ricavo la carta in questione e posso procedere trnaquillamente. Ora devo sostituire le textView con delle ImageView, quindi associargli l'immagine giusta e ricavare che carta è per lo sviluppo corretto del gioco...
Quello che vorrei sapere è un buon modo per portarsi dietro un dato per poter riconoscere la carta esatta.
Se non sono riuscito a spiegarmi meglio chiedete pure, semmai posto pure un po' di codice attuale per comprendere meglio le mie intenzioni.
WE ARE NOT HERE TO JUDGE WHAT'S GOOD FROM BAD, BUT TO DO THE THING THAT ARE RIGHT

Offline Ricky`

  • Amministratore
  • Utente storico
  • *****
  • Post: 3487
  • Respect: +506
    • Github
    • Google+
    • rciovati
    • Mostra profilo
Re:gestire ImageView all'interno di GridView
« Risposta #1 il: 29 Aprile 2012, 16:47:38 CEST »
+1
Credo che il modo migliore sia quello di utilizzare i metodi setTag/getTag :)

Offline N4tty

  • Nuovo arrivato
  • *
  • Post: 13
  • Respect: 0
    • Mostra profilo
    • While(1) QI++;
  • Sistema operativo:
    ArchLinux
Re:gestire ImageView all'interno di GridView
« Risposta #2 il: 29 Aprile 2012, 18:19:11 CEST »
0
è proprio quello che mi serviva!!  :D grazie!

Ultima info: esiste un modo per poter settare un'immagine direttamente da variabile?
e.g.

ImageView v = new ImageView();
v.setTag("bla");
v.setImage(R.drawable.(v.getTag()));

o devo per forza farmi uno switch con 40 casi e per ogni tag assegnare un'immagine con setImage(R.drawble.caso27) ?

Spero sono riuscito a spiegarmi asd
WE ARE NOT HERE TO JUDGE WHAT'S GOOD FROM BAD, BUT TO DO THE THING THAT ARE RIGHT

Offline Ricky`

  • Amministratore
  • Utente storico
  • *****
  • Post: 3487
  • Respect: +506
    • Github
    • Google+
    • rciovati
    • Mostra profilo
Re:gestire ImageView all'interno di GridView
« Risposta #3 il: 29 Aprile 2012, 23:32:08 CEST »
+1
Puoi recuperare l'id della risorsa a partire dal nome in questo modo:

Codice (Java): [Seleziona]
int imgId = getResources().getIdentifier("nome","drawable",getPackageName());

Offline N4tty

  • Nuovo arrivato
  • *
  • Post: 13
  • Respect: 0
    • Mostra profilo
    • While(1) QI++;
  • Sistema operativo:
    ArchLinux
Re:gestire ImageView all'interno di GridView
« Risposta #4 il: 30 Aprile 2012, 00:37:37 CEST »
0
sei un grande! ù_ù
WE ARE NOT HERE TO JUDGE WHAT'S GOOD FROM BAD, BUT TO DO THE THING THAT ARE RIGHT

Offline N4tty

  • Nuovo arrivato
  • *
  • Post: 13
  • Respect: 0
    • Mostra profilo
    • While(1) QI++;
  • Sistema operativo:
    ArchLinux
Re:gestire ImageView all'interno di GridView
« Risposta #5 il: 30 Aprile 2012, 18:33:04 CEST »
0
Alloooora, sto provando a gestire le immagini con un adapter modificato in modo simile al tuo stesso tutorial (ricky)  questi sono i due layout contenenti l'uno il layout principale, l'altro il layout che servirà ad inserire le immagini dinamicamente:

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

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" >
   
    <ImageView android:contentDescription="@string/show_card"
       android:id="@+id/carta"
       android:layout_height="fill_parent"
        android:layout_width="fill_parent"/>
   
</RelativeLayout>

nell'activity principale mi limito a chiamare nell'onCreate

Codice (Java): [Seleziona]
GridView list = (GridView) findViewById(R.id.cartePlayer);
                GridView carteDaPescare = (GridView) findViewById(R.id.tavoloMazzo);
               
                /** array adattatore carte del giocatore */
                mArrayCard = new ArrayList<Carta>();
                for(int j=0;j<4;j++)for(int i=0;i<10;i++) if(player.carteInMano.get(i).getSeme() == j) mArrayCard.add(player.carteInMano.get(i));
               
                mArrayCardAdapter = new CardAdapter(this, R.layout.cards, mArrayCard);
               
                list.setAdapter(mArrayCardAdapter);

la classe CardAdapter è questa:

Codice (Java): [Seleziona]
package n4tty.tre.sette;

import java.util.ArrayList;

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.ImageView;
import android.widget.RelativeLayout;

public class CardAdapter extends ArrayAdapter<Carta> {
       
        private int resource;
        private LayoutInflater inflater;
        private Context context;
       
        public CardAdapter(Context context, int textViewResourceId, ArrayList<Carta> objects) {
                super(context, textViewResourceId, objects);
                // TODO Auto-generated constructor stub
                this.context = context;
                resource = textViewResourceId;
                inflater = LayoutInflater.from(context);
        }
       
        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
               
                Carta carta = getItem(position);
                CardViewCache cacheView;
               
                if(convertView == null) {
                       
                        convertView = (RelativeLayout) inflater.inflate(resource, null);
                        cacheView = new CardViewCache(convertView);
                        convertView.setTag(cacheView);
                } else {
                       
                        convertView = (RelativeLayout) convertView;
                        cacheView = (CardViewCache) convertView.getTag();
                }
               
                ImageView imgCarta = cacheView.getImage();
                //int imgId = context.getResources().getIdentifier(carta.getImg(),"drawable",context.getPackageName());
                imgCarta.setImageResource(R.drawable.assodibastoni);
                imgCarta.setTag(carta.getId());
               
                return parent;
        }
       
       
}

la "cache" è:

Codice (Java): [Seleziona]
package n4tty.tre.sette;

import android.view.View;
import android.widget.ImageView;

public class CardViewCache {
       
        private View            view;
        private ImageView       img;
       
        public CardViewCache(View v) {
               
                view = v;
        }
       
        public ImageView getImage() {
               
                if(img == null) {
                        img = (ImageView) view.findViewById(R.id.carta);
                }
                return img;
        }
}

Non riesco a capire dove sbaglio, il logcat è questo:

04-30 20:26:25.972: E/AndroidRuntime(481): Uncaught handler: thread main exiting due to uncaught exception
04-30 20:26:25.982: E/AndroidRuntime(481): java.lang.ClassCastException: android.widget.LinearLayout$LayoutParams
04-30 20:26:25.982: E/AndroidRuntime(481):    at android.widget.GridView.onMeasure(GridView.java:936)
04-30 20:26:25.982: E/AndroidRuntime(481):    at android.view.View.measure(View.java:7964)
04-30 20:26:25.982: E/AndroidRuntime(481):    at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:3023)
04-30 20:26:25.982: E/AndroidRuntime(481):    at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:888)
04-30 20:26:25.982: E/AndroidRuntime(481):    at android.widget.LinearLayout.measureVertical(LinearLayout.java:350)
04-30 20:26:25.982: E/AndroidRuntime(481):    at android.widget.LinearLayout.onMeasure(LinearLayout.java:278)
04-30 20:26:25.982: E/AndroidRuntime(481):    at android.view.View.measure(View.java:7964)
04-30 20:26:25.982: E/AndroidRuntime(481):    at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:3023)
04-30 20:26:25.982: E/AndroidRuntime(481):    at android.widget.FrameLayout.onMeasure(FrameLayout.java:245)
04-30 20:26:25.982: E/AndroidRuntime(481):    at android.view.View.measure(View.java:7964)
04-30 20:26:25.982: E/AndroidRuntime(481):    at android.widget.LinearLayout.measureVertical(LinearLayout.java:464)
04-30 20:26:25.982: E/AndroidRuntime(481):    at android.widget.LinearLayout.onMeasure(LinearLayout.java:278)
04-30 20:26:25.982: E/AndroidRuntime(481):    at android.view.View.measure(View.java:7964)
04-30 20:26:25.982: E/AndroidRuntime(481):    at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:3023)
04-30 20:26:25.982: E/AndroidRuntime(481):    at android.widget.FrameLayout.onMeasure(FrameLayout.java:245)
04-30 20:26:25.982: E/AndroidRuntime(481):    at android.view.View.measure(View.java:7964)
04-30 20:26:25.982: E/AndroidRuntime(481):    at android.view.ViewRoot.performTraversals(ViewRoot.java:763)
04-30 20:26:25.982: E/AndroidRuntime(481):    at android.view.ViewRoot.handleMessage(ViewRoot.java:1633)
04-30 20:26:25.982: E/AndroidRuntime(481):    at android.os.Handler.dispatchMessage(Handler.java:99)
04-30 20:26:25.982: E/AndroidRuntime(481):    at android.os.Looper.loop(Looper.java:123)
04-30 20:26:25.982: E/AndroidRuntime(481):    at android.app.ActivityThread.main(ActivityThread.java:4363)
04-30 20:26:25.982: E/AndroidRuntime(481):    at java.lang.reflect.Method.invokeNative(Native Method)
04-30 20:26:25.982: E/AndroidRuntime(481):    at java.lang.reflect.Method.invoke(Method.java:521)
04-30 20:26:25.982: E/AndroidRuntime(481):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:860)
04-30 20:26:25.982: E/AndroidRuntime(481):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618)
04-30 20:26:25.982: E/AndroidRuntime(481):    at dalvik.system.NativeStart.main(Native Method)
WE ARE NOT HERE TO JUDGE WHAT'S GOOD FROM BAD, BUT TO DO THE THING THAT ARE RIGHT

Offline Ricky`

  • Amministratore
  • Utente storico
  • *****
  • Post: 3487
  • Respect: +506
    • Github
    • Google+
    • rciovati
    • Mostra profilo
Re:gestire ImageView all'interno di GridView
« Risposta #6 il: 30 Aprile 2012, 18:41:49 CEST »
0
Prova a fare Project-> Clean

Offline N4tty

  • Nuovo arrivato
  • *
  • Post: 13
  • Respect: 0
    • Mostra profilo
    • While(1) QI++;
  • Sistema operativo:
    ArchLinux
Re:gestire ImageView all'interno di GridView
« Risposta #7 il: 30 Aprile 2012, 18:55:25 CEST »
0
niente...  :-(
WE ARE NOT HERE TO JUDGE WHAT'S GOOD FROM BAD, BUT TO DO THE THING THAT ARE RIGHT

Offline N4tty

  • Nuovo arrivato
  • *
  • Post: 13
  • Respect: 0
    • Mostra profilo
    • While(1) QI++;
  • Sistema operativo:
    ArchLinux
Re:gestire ImageView all'interno di GridView
« Risposta #8 il: 04 Maggio 2012, 20:16:20 CEST »
0
Nessuno che riesce ad aiutarmi?
WE ARE NOT HERE TO JUDGE WHAT'S GOOD FROM BAD, BUT TO DO THE THING THAT ARE RIGHT