Autore Topic: Listview in una Canvas. Nullexception error  (Letto 430 volte)

Offline gorgo

  • Nuovo arrivato
  • *
  • Post: 6
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy s2
  • Sistema operativo:
    Win7 / Linux Mint 14
Listview in una Canvas. Nullexception error
« il: 07 Aprile 2013, 19:49:55 CEST »
0
Sto sviluppando la mia prima app. E' un gioco e sto utilizzando il pattern MVC con le API 10.
Ho bisogno di inserire una listView nella mia canvas, come ho fatto in questo progetto di test

Qui non ho usato canvas. Lo sfondo è caricato con android:background nel Manifest.

Nella mia activity, nell'onCreate(), chiamo setContentView(new MainGamePanel(this)); dove MaingamePanel è una SurfaceView che si occupa di inizializzare render/update e Thread del GameLoop.
Purtroppo però se definisco così la ListView, mi dà error sul setAdapter...molto probabilmente perchè non va a buon fine la findViewById :/

Pirates.Java

   
Codice: [Seleziona]
[...]
    protected void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                setContentView(new MainGamePanel(this));
               
                // Setting dialogs
               
                lview3 = (ListView) findViewById(R.id.mylist);
                adapter = new ListViewCustomAdapter(this, month);
                lview3.setAdapter(adapter);
    }
    [...]

activity_pirates.xml

   
Codice (XML): [Seleziona]
 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
   xmlns:tools="http://schemas.android.com/tools"
   android:layout_width="fill_parent"
   android:layout_height="fill_parent"
   android:orientation="vertical"
   tools:context=".Pirates" >

     <ListView
       android:id="@+id/mylist"
       android:layout_width="match_parent"
       android:layout_height="110dp"
       android:layout_gravity="center_horizontal|bottom"
       android:background="@android:color/transparent"
                android:cacheColorHint="@android:color/transparent"
                android:divider="#00000000"
                android:drawSelectorOnTop="true">
    </ListView>

</LinearLayout>

ListViewCustomAdapter.java

   
Codice: [Seleziona]
public class ListViewCustomAdapter extends BaseAdapter
    {
        public String title[];


        public Activity context;
        public LayoutInflater inflater;

        public ListViewCustomAdapter(Activity context,String[] title) {
                super();

                this.context = context;
                this.title = title;
            this.inflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        }
    @Override
        public View getView(int position, View convertView, ViewGroup parent) {
                // TODO Auto-generated method stub

                Typeface chops = Typeface.createFromAsset(this.context.getAssets(),
                                "Commodore.ttf");

                ViewHolder holder;
                if(convertView==null)
                {
                        holder = new ViewHolder();
                        convertView = inflater.inflate(R.layout.listitem_row, null);

                        holder.txtViewTitle = (TextView) convertView.findViewById(R.id.txtViewTitle);

                        convertView.setTag(holder);
                }
                else
                        holder=(ViewHolder)convertView.getTag();

                holder.txtViewTitle.setText(title[position]);
                holder.txtViewTitle.setTypeface(chops);
                holder.txtViewTitle.setShadowLayer(10, 5, 5, Color.BLACK);
                holder.txtViewTitle.measure(MeasureSpec.makeMeasureSpec(convertView.getWidth()-5, MeasureSpec.EXACTLY), MeasureSpec.makeMeasureSpec(convertView.getHeight(), MeasureSpec.EXACTLY));
                holder.txtViewTitle.layout(0, 0, holder.txtViewTitle.getMeasuredWidth(), holder.txtViewTitle.getMeasuredHeight());
                holder.txtViewTitle.setTextSize(13);

                return convertView;
        }

LogCat

   
Codice: [Seleziona]
04-07 19:09:00.085: I/System.out(17638): Sprite Loaded
    04-07 19:09:00.085: D/PirateRenderer(17638): Pirata CARICATO
    04-07 19:09:00.110: D/dalvikvm(17638): GC_FOR_ALLOC freed 16K, 6% free 26987K/28423K, paused 24ms, total 24ms
    04-07 19:09:00.115: I/dalvikvm-heap(17638): Grow heap (frag case) to 30.366MB for 2949136-byte allocation
    04-07 19:09:00.150: D/dalvikvm(17638): GC_CONCURRENT freed <1K, 5% free 29866K/31367K, paused 13ms+2ms, total 35ms
    04-07 19:09:00.155: D/PirateRenderer(17638): Sfondo CARICATO
    04-07 19:09:00.170: D/AndroidRuntime(17638): Shutting down VM
    04-07 19:09:00.170: W/dalvikvm(17638): threadid=1: thread exiting with uncaught exception (group=0x41a782a0)
    04-07 19:09:00.170: E/AndroidRuntime(17638): FATAL EXCEPTION: main
    04-07 19:09:00.170: E/AndroidRuntime(17638): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.pirates/com.gorgo.pirates.Pirates}: java.lang.NullPointerException
    04-07 19:09:00.170: E/AndroidRuntime(17638):         at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2110)
    04-07 19:09:00.170: E/AndroidRuntime(17638):         at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2135)
    04-07 19:09:00.170: E/AndroidRuntime(17638):         at android.app.ActivityThread.access$700(ActivityThread.java:140)
    04-07 19:09:00.170: E/AndroidRuntime(17638):         at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1237)
    04-07 19:09:00.170: E/AndroidRuntime(17638):         at android.os.Handler.dispatchMessage(Handler.java:99)
    04-07 19:09:00.170: E/AndroidRuntime(17638):         at android.os.Looper.loop(Looper.java:137)
    04-07 19:09:00.170: E/AndroidRuntime(17638):         at android.app.ActivityThread.main(ActivityThread.java:4921)
    04-07 19:09:00.170: E/AndroidRuntime(17638):         at java.lang.reflect.Method.invokeNative(Native Method)
    04-07 19:09:00.170: E/AndroidRuntime(17638):         at java.lang.reflect.Method.invoke(Method.java:511)
    04-07 19:09:00.170: E/AndroidRuntime(17638):         at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1027)
    04-07 19:09:00.170: E/AndroidRuntime(17638):         at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:794)
    04-07 19:09:00.170: E/AndroidRuntime(17638):         at dalvik.system.NativeStart.main(Native Method)
    04-07 19:09:00.170: E/AndroidRuntime(17638): Caused by: java.lang.NullPointerException
    04-07 19:09:00.170: E/AndroidRuntime(17638):         at com.gorgo.pirates.Pirates.onCreate(Pirates.java:29)
    04-07 19:09:00.170: E/AndroidRuntime(17638):         at android.app.Activity.performCreate(Activity.java:5206)
    04-07 19:09:00.170: E/AndroidRuntime(17638):         at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1094)
    04-07 19:09:00.170: E/AndroidRuntime(17638):         at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2074)
    04-07 19:09:00.170: E/AndroidRuntime(17638):         ... 11 more

Così ho provato a chiamarlo con:

   
Codice: [Seleziona]
protected void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                MainGamePanel ms = new MainGamePanel(this);
                setContentView(ms);
               
                lview3 = (ListView) ms.findViewById(R.id.mylist);
                adapter = new ListViewCustomAdapter(this, month);
                lview3.setAdapter(adapter);
Usando ms.findViewById ma senza successo.

Ho provato con un inflater

      
Codice: [Seleziona]
LayoutInflater li = (LayoutInflater) getSystemService(LAYOUT_INFLATER_SERVICE);
        View v = li.inflate(R.layout.activity_pirates, null);
                lview3 = (ListView) v.findViewById(R.id.mylist);
                adapter = new ListViewCustomAdapter(this, month);
                lview3.setAdapter(adapter);



TOGLIE l'eccezione, ma la ListView non viene visualizzata.

Sono bloccato :(
Qualche idea??

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:Listview in una Canvas. Nullexception error
« Risposta #1 il: 07 Aprile 2013, 20:46:29 CEST »
0
Il fatto è che il findviewbyid vorrebbe trovare la listeview mylist all'interno del layout che hai specificato, che non sembra essere quello di activity_pirates.xml.

Tu imposti il setcontentview così:
Codice (Java): [Seleziona]
setContentView(new MainGamePanel(this));
Nel contentview ritornato da MainGamePanel(this) c'è la listview?
NON rispondo a domande nei messaggi privati
Bradipao @ Play Store

Offline gorgo

  • Nuovo arrivato
  • *
  • Post: 6
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy s2
  • Sistema operativo:
    Win7 / Linux Mint 14
Re:Listview in una Canvas. Nullexception error
« Risposta #2 il: 07 Aprile 2013, 20:48:51 CEST »
0
Hmm mi sa di no, però non so come passarglielo utilizzando un custom layout :(
Ho fatto qualche modifica a MainGamePanel:

Ho aggiunto due costruttori:

Codice: [Seleziona]
public MainGamePanel(Context context, AttributeSet attrs){
                this(context,attrs,R.layout.activity_pirates);
        }
       
        public MainGamePanel(Context context, AttributeSet attrs, int defStyle){
                super(context,attrs,defStyle);
        }

E activity_pirates.xml l'ho modificato così:

Codice: [Seleziona]
<MainGamePanel xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    tools:context=".Pirates" >

   <ListView
        android:id="@+id/mylist"
        android:layout_width="match_parent"
        android:layout_height="110dp"
        android:layout_gravity="center_horizontal|bottom"
        android:background="@android:color/transparent"
                android:cacheColorHint="@android:color/transparent"
                android:divider="#00000000"
                android:drawSelectorOnTop="true">
    </ListView>
</MainGamePanel>

Ma lview3 = (ListView) findViewById(R.id.mylist); torna sempre null

Post unito: 07 Aprile 2013, 23:21:05 CEST
Ok ho capito il problema! Usavo la ListView come "figlia" di una SurfaceView, mentre vanno usate in parallelo.

Qui il codice XML: http://pastebin.com/DrxMBv7M
« Ultima modifica: 07 Aprile 2013, 23:21:09 CEST da gorgo, Reason: Merged DoublePost »