Autore Topic: getActivity return NULL Listview Adapter  (Letto 1081 volte)

Offline lillogoal

  • Utente normale
  • ***
  • Post: 167
  • Respect: +4
    • Google+
    • lillosogliani
    • Mostra profilo
    • LilloNet
  • Dispositivo Android:
    Galaxy s3, Nexus 7,galaxy s advance,galaxy scl
  • Play Store ID:
    Lillonet Inc.
  • Sistema operativo:
    Windows 8,7 & Kali-Linux
getActivity return NULL Listview Adapter
« il: 08 Settembre 2013, 14:37:43 CEST »
0
Salve a tutti,
scusa il disturbo stavo cercando di fare una listview per il parsing di un pagina per la mi app, vi spiego: Ho un actionbar formata da Fragment.
Quando instazia il fragment, all'apertura dell'app la prima volta "getActivity" non ritorna null, è la volta successiva, quando faccio ripartire l'Asynctask
Nel fragment in cui farò il parsing riscontro questo errore:
Codice: [Seleziona]
java.lang.NullPointerException
        at android.widget.ArrayAdapter.init(ArrayAdapter.java:310)
        at android.widget.ArrayAdapter.<init>(ArrayAdapter.java:104)
        at com.megadown.megacodownloader.ParsingArrayAdapter.<init>(ParsingArrayAdapter.java:30)
        at com.megadown.megacodownloader.Tab_Search$ParsingPaginaWeb.onPostExecute(Tab_Search.java:264)
        at com.megadown.megacodownloader.Tab_Search$ParsingPaginaWeb.onPostExecute(Tab_Search.java:125)
        at android.os.AsyncTask.finish(AsyncTask.java:631)
        at android.os.AsyncTask.access$600(AsyncTask.java:177)
        at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:644)
        at android.os.Handler.dispatchMessage(Handler.java:99)
        at android.os.Looper.loop(Looper.java:137)
        at android.app.ActivityThread.main(ActivityThread.java:4898)
        at java.lang.reflect.Method.invokeNative(Native Method)
        at java.lang.reflect.Method.invoke(Method.java:511)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1006)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:773)
        at dalvik.system.NativeStart.main(Native Method)

E il pezzo a cui si riferisce:
Codice (Java): [Seleziona]
protected void onPostExecute(String result)
        {
            // dopo che ho eseguito il parsing mostro i dati nella listview

                adapter = new ParsingArrayAdapter(myActivity, titoli, descrizioni,immagini);
                lista.setAdapter(adapter);



        }

Se Volete Posso postare il codice del ArrayAdapter.
Vi ringrazio in anticipo
Chi non progetta la sicurezza , programma il fallimento! K.M

Offline Ricky`

  • Amministratore
  • Utente storico
  • *****
  • Post: 3489
  • Respect: +506
    • Github
    • Google+
    • rciovati
    • Mostra profilo
Re:getActivity return NULL Listview Adapter
« Risposta #1 il: 08 Settembre 2013, 15:51:30 CEST »
+1
Fai riferimento al lifecycle dei fragment:



E tieni conto della nota scritta nella documentazione:

Citazione
Caution: If you need a Context object within your Fragment, you can call getActivity(). However, be careful to call getActivity() only when the fragment is attached to an activity. When the fragment is not yet attached, or was detached during the end of its lifecycle, getActivity() will return null.

Detto questo, devi in qualche modo sincronizzare l'esecuzione dell'AsyncTask con il ciclo di vita del Fragment perchè se quest'ultimo non è più attaccato all'Activity (ovvero getActivity ritorna null) non ha neanche più senso che vai ad aggiornare la listview.

Una soluzione naive potrebbe essere chiamare il metodo .cancel(true) dell'AsyncTask nell'onStop del Fragment.

Offline lillogoal

  • Utente normale
  • ***
  • Post: 167
  • Respect: +4
    • Google+
    • lillosogliani
    • Mostra profilo
    • LilloNet
  • Dispositivo Android:
    Galaxy s3, Nexus 7,galaxy s advance,galaxy scl
  • Play Store ID:
    Lillonet Inc.
  • Sistema operativo:
    Windows 8,7 & Kali-Linux
Re:getActivity return NULL Listview Adapter
« Risposta #2 il: 08 Settembre 2013, 15:53:57 CEST »
0
Ti ringrazio davvero, sei stato davvero esplicativo, provo e ti faccio sapere subito!
così giusto:
Codice (Java): [Seleziona]
@Override
    public void onStop() {
        super.onStop();
        parsing.cancel(true);
    }

Post unito: 08 Settembre 2013, 16:04:37 CEST
Niente sempre null, :(
« Ultima modifica: 08 Settembre 2013, 16:05:44 CEST da lillogoal »
Chi non progetta la sicurezza , programma il fallimento! K.M

Offline Ricky`

  • Amministratore
  • Utente storico
  • *****
  • Post: 3489
  • Respect: +506
    • Github
    • Google+
    • rciovati
    • Mostra profilo
Re:getActivity return NULL Listview Adapter
« Risposta #3 il: 08 Settembre 2013, 16:15:27 CEST »
0
Nell'onPostExecute metti comunque un controllo per capire se il task è stato cancellato (controlla il valore di isCancelled()).

Offline lillogoal

  • Utente normale
  • ***
  • Post: 167
  • Respect: +4
    • Google+
    • lillosogliani
    • Mostra profilo
    • LilloNet
  • Dispositivo Android:
    Galaxy s3, Nexus 7,galaxy s advance,galaxy scl
  • Play Store ID:
    Lillonet Inc.
  • Sistema operativo:
    Windows 8,7 & Kali-Linux
Re:getActivity return NULL Listview Adapter
« Risposta #4 il: 08 Settembre 2013, 16:17:54 CEST »
0
così??
Codice (Java): [Seleziona]
if(this.isCancelled() == true)
                {
                    adapter = new ParsingArrayAdapter(getActivity(), titoli, descrizioni,immagini);
                    lista.setAdapter(adapter);
                }else
                {
                    this.cancel(true);
                }
Chi non progetta la sicurezza , programma il fallimento! K.M

Offline Ricky`

  • Amministratore
  • Utente storico
  • *****
  • Post: 3489
  • Respect: +506
    • Github
    • Google+
    • rciovati
    • Mostra profilo
Re:getActivity return NULL Listview Adapter
« Risposta #5 il: 08 Settembre 2013, 16:22:32 CEST »
0
Il cancel lo lasci nell'onStop, quindi va bene quello statement ma senza l'else.

Offline lillogoal

  • Utente normale
  • ***
  • Post: 167
  • Respect: +4
    • Google+
    • lillosogliani
    • Mostra profilo
    • LilloNet
  • Dispositivo Android:
    Galaxy s3, Nexus 7,galaxy s advance,galaxy scl
  • Play Store ID:
    Lillonet Inc.
  • Sistema operativo:
    Windows 8,7 & Kali-Linux
Re:getActivity return NULL Listview Adapter
« Risposta #6 il: 08 Settembre 2013, 16:24:54 CEST »
0
si ma così non visualizzerò mai niente nella listview, cmq l'onstop si ripete ogni volta che si spegne lo schermo vero?
Chi non progetta la sicurezza , programma il fallimento! K.M

Offline lillogoal

  • Utente normale
  • ***
  • Post: 167
  • Respect: +4
    • Google+
    • lillosogliani
    • Mostra profilo
    • LilloNet
  • Dispositivo Android:
    Galaxy s3, Nexus 7,galaxy s advance,galaxy scl
  • Play Store ID:
    Lillonet Inc.
  • Sistema operativo:
    Windows 8,7 & Kali-Linux
Re:getActivity return NULL Listview Adapter
« Risposta #7 il: 10 Settembre 2013, 22:33:31 CEST »
0
UPPP!!!! e' abbastanza urgente scusate
Chi non progetta la sicurezza , programma il fallimento! K.M

Offline matttt

Re:getActivity return NULL Listview Adapter
« Risposta #8 il: 10 Settembre 2013, 23:45:55 CEST »
0
si ma così non visualizzerò mai niente nella listview, cmq l'onstop si ripete ogni volta che si spegne lo schermo vero?

Lillo se vuoi fare qualcosa a schermo spento devi usare un WakeLock:
PowerManager | Android Developers
Oppure gestire le operazioni tramite un servizio:
Services | Android Developers

Non è una cosa semplice però...
Le mie apps su Google Play Store:

Offline lillogoal

  • Utente normale
  • ***
  • Post: 167
  • Respect: +4
    • Google+
    • lillosogliani
    • Mostra profilo
    • LilloNet
  • Dispositivo Android:
    Galaxy s3, Nexus 7,galaxy s advance,galaxy scl
  • Play Store ID:
    Lillonet Inc.
  • Sistema operativo:
    Windows 8,7 & Kali-Linux
Re:getActivity return NULL Listview Adapter
« Risposta #9 il: 10 Settembre 2013, 23:48:09 CEST »
0
no a me interessa correggere il problema che mi ritorna il null dalla getactivity che uso per l'adapter
Chi non progetta la sicurezza , programma il fallimento! K.M

Offline matttt

Re:getActivity return NULL Listview Adapter
« Risposta #10 il: 10 Settembre 2013, 23:55:31 CEST »
0
Sono di fretta ora e non mi sono letto tutto quel che vi siete scritti cmq puoi provare a mettere:
Codice (Java): [Seleziona]
mAdapter = new ParsingArrayAdapter( getActivity() );
lista.setAdapter( mAdapter );
Nell' onCreate() dell' Activity e ti tieni un riferimento all'adapter.

Modifichi il tuo custom adapter in modo che invece di aggiornare gli elementi nel costrutture lo faccia con una funzione apposita.
Fai quel che devi col Fragment / dialog e richiami la nuova funzione nel onPostExecute.
Infine notifichi di un cambiamento nell'adapter.
Codice (Java): [Seleziona]
mAdapter.init( titoli, descrizioni, immagini );
mAdapter.notifyDataSetChanged();
« Ultima modifica: 10 Settembre 2013, 23:59:07 CEST da matttt »
Le mie apps su Google Play Store:

Offline lillogoal

  • Utente normale
  • ***
  • Post: 167
  • Respect: +4
    • Google+
    • lillosogliani
    • Mostra profilo
    • LilloNet
  • Dispositivo Android:
    Galaxy s3, Nexus 7,galaxy s advance,galaxy scl
  • Play Store ID:
    Lillonet Inc.
  • Sistema operativo:
    Windows 8,7 & Kali-Linux
Re:getActivity return NULL Listview Adapter
« Risposta #11 il: 10 Settembre 2013, 23:59:55 CEST »
0
MMMM.... non ho ben capito, vediamo: allora io nel mio adapter  la classe che richiamo è questa:
Codice (Java): [Seleziona]
public ParsingArrayAdapter(Context context, ArrayList<String> titoli, ArrayList<String> descrizioni, int[] immagini)
        {
                super(context,TITOLO);
                this.c = context;
                this.titoli = titoli;
                this.descrizioni = descrizioni;
        this.immagini = immagini;
                this.inflater = LayoutInflater.from(c);
        }
Chi non progetta la sicurezza , programma il fallimento! K.M

Offline matttt

Re:getActivity return NULL Listview Adapter
« Risposta #12 il: 11 Settembre 2013, 13:40:18 CEST »
0
Ma... non vai meglio con un unico ArrayList di Oggetti tuoi con titolo, descrizione e immagine?

Cmq a parte questo quel che ti proponevo è:
- di preparare adapter e listview nell' onCreate() della tua Activity;
- aprire il dialog o fragment o quello che vuoi (finchè rimani nella stessa Activity...);
- quando hai fatto col dialog (quindi in post execute) aggiorni l'adapter e richiami la funzione (notifyDataSetChanged) che notifica il listview di un cambiamento nella lista degli elementi.

Poi il tuo listview dovrebbe aggiornarsi.

Cosa non ti è chiaro?
Le mie apps su Google Play Store:

Offline lillogoal

  • Utente normale
  • ***
  • Post: 167
  • Respect: +4
    • Google+
    • lillosogliani
    • Mostra profilo
    • LilloNet
  • Dispositivo Android:
    Galaxy s3, Nexus 7,galaxy s advance,galaxy scl
  • Play Store ID:
    Lillonet Inc.
  • Sistema operativo:
    Windows 8,7 & Kali-Linux
Re:getActivity return NULL Listview Adapter
« Risposta #13 il: 11 Settembre 2013, 13:59:22 CEST »
0
Guarda ho provato facendo così come hai detto:

Codice (Java): [Seleziona]
adapter.notifyDataSetChanged();
Codice: [Seleziona]
java.lang.NullPointerException
        at com.megadown.megacodownloader.Tab_Search$ParsingPaginaWeb.onPostExecute(Tab_Search.java:321)
        at com.megadown.megacodownloader.Tab_Search$ParsingPaginaWeb.onPostExecute(Tab_Search.java:155)
        at android.os.AsyncTask.finish(AsyncTask.java:631)
        at android.os.AsyncTask.access$600(AsyncTask.java:177)
        at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:644)
        at android.os.Handler.dispatchMessage(Handler.java:99)
        at android.os.Looper.loop(Looper.java:137)
        at android.app.ActivityThread.main(ActivityThread.java:4898)
        at java.lang.reflect.Method.invokeNative(Native Method)
        at java.lang.reflect.Method.invoke(Method.java:511)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1006)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:773)
        at dalvik.system.NativeStart.main(Native Method)

il problema è che nella Main_Activity: instanzio la classe di nuovo, perchè devo settare la search view nel menu ti faccio veder:
 
Codice (Java): [Seleziona]
Tab_Search tbs = new Tab_Search();
public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        MenuInflater menuInflater = getMenuInflater();
        menuInflater.inflate(R.menu.main, menu);


        //MainActivity.this.((Tab_Search).getActivity());
        MenuInflater inflater = getMenuInflater();
        inflater.inflate(R.menu.main_action, menu);
        MenuItem searchItem;
        searchItem = menu.findItem(R.id.action_search);

        tbs.mSearchView = (SearchView) searchItem.getActionView();
        tbs.mSearchView.setQueryHint("Inserisci Qualcosa da Cercare:");
        tbs.setupSearchView(searchItem);

        return true;
    }

Post unito: 13 Settembre 2013, 11:15:07 CEST
Upppppp
« Ultima modifica: 13 Settembre 2013, 11:15:07 CEST da lillogoal, Reason: Merged DoublePost »
Chi non progetta la sicurezza , programma il fallimento! K.M

Offline lillogoal

  • Utente normale
  • ***
  • Post: 167
  • Respect: +4
    • Google+
    • lillosogliani
    • Mostra profilo
    • LilloNet
  • Dispositivo Android:
    Galaxy s3, Nexus 7,galaxy s advance,galaxy scl
  • Play Store ID:
    Lillonet Inc.
  • Sistema operativo:
    Windows 8,7 & Kali-Linux
Re:getActivity return NULL Listview Adapter
« Risposta #14 il: 14 Settembre 2013, 14:56:23 CEST »
0
Come pensavo, sbagliavo a rinstazione la classe della Tab_search
Chi non progetta la sicurezza , programma il fallimento! K.M