Autore Topic: Refresh ListView di un fragment da una activity  (Letto 2272 volte)

Offline fermat

  • Utente junior
  • **
  • Post: 93
  • Respect: +1
    • Mostra profilo
    • Mattepuffo.com
Refresh ListView di un fragment da una activity
« il: 01 Dicembre 2013, 16:55:36 CET »
0
ciao!

nell'activity, con AsycnTask, aggiorno i dati che poi vanno a riempire varie listview che stanno in vari fragment.
per ora per aggiornare le liste riavvio l'activity:
Codice: [Seleziona]
        public class DownloadDatas extends AsyncTask<Object, Object, Object>  {
               
                @Override
                protected Object doInBackground(Object... params) {
                        // DO STUFF
                        return null;
                }
               
                @Override
        protected void onPostExecute(Object result) {
                        finish();
                        startActivity(getIntent());
                }
        }
se io non volessi riavviare tutta la activity, come potrei fare?
in sostanza vorrei aggiornare le listview dei fragment direttamente.

iClaude

  • Visitatore
Re:Refresh ListView di un fragment da una activity
« Risposta #1 il: 02 Dicembre 2013, 10:41:10 CET »
0
Io creerei un metodo pubblico all'interno del Fragment, che imposta delle variabili interne e che forza l'aggiornamento della Listview. Questo metodo poi lo chiami dalla tua Activity.

Offline Nicola_D

  • Utente storico
  • *****
  • Post: 2479
  • SBAGLIATO!
  • Respect: +323
    • Github
    • Google+
    • nicoladorigatti
    • Mostra profilo
  • Dispositivo Android:
    Nexus 6p, Nexus 4, Nexus S, Nexus 7(2012)
  • Sistema operativo:
    Windows 7
Re:Refresh ListView di un fragment da una activity
« Risposta #2 il: 02 Dicembre 2013, 11:05:10 CET »
0
riavviare l'activity per refreshare le liste?
esite il metodo "notifyDataSetChanged" apposta!
nei fragment è un pò meno semplice, ma comunque fattibile.
Avevo fatto un tutorial su come fare il backup su database, e li dentro avevo tre fragment, uno di inserimento, uno di "controllo" e uno di backup.
Quando inserisci nel primo, il secondo (che ha una listview) si aggiorna.
[medio] Backup di un database SQLite su sdcard. - Android Developers Italia
IMPORTANTE:NON RISPONDO A PROBLEMI VIA MESSAGGIO PRIVATO
LOGCAT: Non sai cos'è? -> Android Debug Bridge | Android Developers
               Dov'è in Eclipse? -> Window -> Open Prospective -> DDMS e guarda in basso!
[Obbligatorio] Logcat, questo sconosciuto! (Gruppo AndDev.it LOGTFO) - Android Developers Italia

Offline fermat

  • Utente junior
  • **
  • Post: 93
  • Respect: +1
    • Mostra profilo
    • Mattepuffo.com
Re:Refresh ListView di un fragment da una activity
« Risposta #3 il: 02 Dicembre 2013, 11:15:20 CET »
0
ciao!

hai ragione.
ed infatti in un'altra app faccio esattamente come dici te.
il problema è un altro.

in un caso io ho la listview nell'activity dove eseguo le operazioni, e quindi nel postdata faccio come dici.

nel caso in questione invece io la activity dove recupero i dati, ed inizializzo la listview nel fragment.
quindi, come faccio a richiamare notifyDataSetChanged nel fragment dopo l'aggiornamento dei dati??
non so se ho spiegato bene il mio problema!

Offline Nicola_D

  • Utente storico
  • *****
  • Post: 2479
  • SBAGLIATO!
  • Respect: +323
    • Github
    • Google+
    • nicoladorigatti
    • Mostra profilo
  • Dispositivo Android:
    Nexus 6p, Nexus 4, Nexus S, Nexus 7(2012)
  • Sistema operativo:
    Windows 7
Re:Refresh ListView di un fragment da una activity
« Risposta #4 il: 02 Dicembre 2013, 13:53:09 CET »
0
puoi fare come ho fatto io nel tutorial, oppure puoi lavorare per interfacce e listener, ossia l'activity definisce un'interfaccia di un listener implementato dal fragment della listview, quando l'activity chiama il listener, nel fragment fai quello che devi!
C'è un tutorial qui sul forum (fatto dall'ottimo Bradipao se non sbaglio) che mostra la comunicazione tra fragment-activity
IMPORTANTE:NON RISPONDO A PROBLEMI VIA MESSAGGIO PRIVATO
LOGCAT: Non sai cos'è? -> Android Debug Bridge | Android Developers
               Dov'è in Eclipse? -> Window -> Open Prospective -> DDMS e guarda in basso!
[Obbligatorio] Logcat, questo sconosciuto! (Gruppo AndDev.it LOGTFO) - Android Developers Italia

Offline fermat

  • Utente junior
  • **
  • Post: 93
  • Respect: +1
    • Mostra profilo
    • Mattepuffo.com
Re:Refresh ListView di un fragment da una activity
« Risposta #5 il: 03 Dicembre 2013, 22:21:15 CET »
0
ad essere sincero continuo ad avere qualche problema con il mio caso specifico.
ho fatto un pò di tentivi, di cui l'ultimo il più banale:
Codice: [Seleziona]
                @Override
        protected void onPostExecute(Object result) {
                        pd.dismiss();
                        //finish();
                        //startActivity(getIntent());
                        FragmentEntries fe = (FragmentEntries) getFragmentManager().findFragmentById(R.id.entries_fragment);
                        ((SimpleAdapter) fe.getListView().getAdapter()).notifyDataSetChanged();
                }
non ottengo errori, ma non ottengo neanche un aggiornamento della lista.

anche usando un listener, come in vari esempi, non sono riuscito.
più che altro non riesco ad adattarlo al caso specifico.

Post unito: 03 Dicembre 2013, 22:56:43 CET
vi posto anche l'esempio con l'uso di una interfaccia, che ho visto essere il modo più comune per far comunicare Activity e Fragment.
nel mio Fragment che estende ListFragment:
Codice: [Seleziona]
        private OnRefreshDataListener listener = null;

        public interface OnRefreshDataListener {
                public void refreshList();
        }

        @Override
        public void onAttach(Activity activity) {
                super.onAttach(activity);
                if (activity instanceof OnRefreshDataListener) {
                        listener = (OnRefreshDataListener) activity;
                }
        }
activity:
Codice: [Seleziona]
public class ActivityMain extends Activity implements FragmentEntries.OnRefreshDataListener {
...........

                @Override
        protected void onPostExecute(Object result) {
                        pd.dismiss();
                        //finish();
                        //startActivity(getIntent());
                        refreshList();
                }
.........

        @Override
        public void refreshList() {
                FragmentEntries fe = (FragmentEntries) getFragmentManager().findFragmentById(R.id.entries_fragment);
                ((SimpleAdapter) fe.getListView().getAdapter()).notifyDataSetChanged();
        }

}
non succede nulla, neanche un errore.
la lista rimane com'è fino a che non riavvio la app.
« Ultima modifica: 03 Dicembre 2013, 22:56:43 CET da fermat, Reason: Merged DoublePost »

iClaude

  • Visitatore
Re:Refresh ListView di un fragment da una activity
« Risposta #6 il: 04 Dicembre 2013, 08:39:33 CET »
0
Provo a specificare meglio la mia risposta iniziale, sperando di essere d'aiuto...

Nella tua Activity principale, quella che gestisce i Fragment, avrai senz'altro un reference al Fragment che vuoi aggiornare.
Bene, basta dunque seguire questi semplici passi:
1) all'interno del tuo Fragment crei un metodo pubblico. Questo metodo accetta come parametro i nuovi dati associati al tuo Adapter (es. un nuovo Cursor). Associ i dati all'Adapter e forzi l'aggiornamento della Listview con notifyDataSetChanged
2) nella Activity principale semplicemente chiami questo metodo pubblico passando i nuovi dati (es. Cursor)
3) ovviamente anche il metodo onCreateView del Fragment dovrà in qualche modo fare uso dei nuovi dati.

Offline fermat

  • Utente junior
  • **
  • Post: 93
  • Respect: +1
    • Mostra profilo
    • Mattepuffo.com
Re:Refresh ListView di un fragment da una activity
« Risposta #7 il: 07 Dicembre 2013, 15:43:26 CET »
0
allora, io ho fatto così.
nel fragment:
Codice: [Seleziona]
        public void refreshLista() {
                list.clear();
                setLista();
                adapter.notifyDataSetChanged();
        }
il metodo setLista() si occupa di leggere il file, reperire i dati e riempire la ListView.
poi nell'activity:
Codice: [Seleziona]
                @Override
                protected void onPostExecute(Object result) {
                        FragmentEntries fe = (FragmentEntries) getFragmentManager()
                                        .findFragmentById(R.id.entries_fragment);
                        fe.refreshLista();
                }
ma continua a non succedere nulla.
o meglio, vengono fatte tutte le operazioni, tranne il refresh della lista.

iClaude

  • Visitatore
Re:Refresh ListView di un fragment da una activity
« Risposta #8 il: 09 Dicembre 2013, 12:43:19 CET »
0
Qual è l'origine dei dati?
Database o altro?
Prova a mettere un po' di Log.e per cercare di capire cosa non viene eseguito...

Offline fermat

  • Utente junior
  • **
  • Post: 93
  • Respect: +1
    • Mostra profilo
    • Mattepuffo.com
Re:Refresh ListView di un fragment da una activity
« Risposta #9 il: 09 Dicembre 2013, 15:41:33 CET »
0
ciao.

la sorgente è il file in formato json che scarico dal web.
il file json, quando eseguo le operazioni remote, viene sovrascritto e quindi aggiornato.

ho fatto qualche prova di log.
se ad esempio stampo l'arraylist, vedo che i dati sono quelli nuovi.
infatti se chiudo la app e la riapro ho i dati aggiornati.

in pratica quello che non sembra funzionare è l'aggiornamento della listview in tempo reale.
la parte grafica diciamo!

iClaude

  • Visitatore
Re:Refresh ListView di un fragment da una activity
« Risposta #10 il: 10 Dicembre 2013, 12:23:39 CET »
0
Nel metodo refreshLista, subito dopo aver chiamato fillData, verifica che i dati associati all'adapter siano stati modificati.

Offline fermat

  • Utente junior
  • **
  • Post: 93
  • Respect: +1
    • Mostra profilo
    • Mattepuffo.com
Re:Refresh ListView di un fragment da una activity
« Risposta #11 il: 10 Dicembre 2013, 21:29:09 CET »
0
ho fatto questa prova.
il SimpleAdapter prende i dati da:
Codice: [Seleziona]
ArrayList<HashMap<String, String>> list = new ArrayList<HashMap<String, String>>();
riempio list nel metodo setLista().
faccio stampare i dati di list ogni volta che richiamo setLista(), alla fine del metodo come ultima istruzione.
questo il risultato in apertura di app:
Codice: [Seleziona]
LIST: [{valore=500.00,}]
questo dopo aver fatto una modifica ed aver aggiornato i dati:
Codice: [Seleziona]
LIST: [{valore=1500.00,}]
però la listview non si aggiorna fino a che non riavvio la app.

che altro test posso fare??

Offline fermat

  • Utente junior
  • **
  • Post: 93
  • Respect: +1
    • Mostra profilo
    • Mattepuffo.com
Re:Refresh ListView di un fragment da una activity
« Risposta #12 il: 15 Dicembre 2013, 11:17:43 CET »
0
sto rimandendo un pò perplesso.
non riesco a capire, ed ho fatto 2000 prove.
anche così non cambia nulla.
questo il metodo setLista con cui riempio la listview:
Codice: [Seleziona]
        public void setLista() {
                list = new ArrayList<HashMap<String, String>>();
                list.clear();
                try {
                        JSONArray jsonArray = new JSONArray(
                                        JsonFile.read(UrlAndPath.LOCAL_PATH
                                                        + UrlAndPath.JSON_LAST_ENTRIES));
                        for (int i = 0; i < jsonArray.length(); i++) {
                                JSONObject jo = jsonArray.getJSONObject(i);
                                HashMap<String, String> map = new HashMap<String, String>();
                                map.put("id", jo.getString("id"));
                                map.put("valore", jo.getString("valore"));
                                map.put("causale_id", jo.getString("causale_id"));
                                map.put("causale", jo.getString("causale"));
                                map.put("conto_id", jo.getString("conto_id"));
                                map.put("conto", jo.getString("conto"));
                                map.put("data", jo.getString("data"));
                                map.put("note", jo.getString("note"));
                                list.add(map);
                        }
                } catch (ClientProtocolException ex) {
                } catch (IOException ex) {
                } catch (JSONException ex) {
                }

                adapter = new SimpleAdapter(getActivity(), list, R.layout.list_items,
                                new String[] { "id", "valore", "causale_id", "causale",
                                                "conto_id", "conto", "data", "note" }, new int[] {
                                                R.id.txt_id, R.id.txt_valore, R.id.txt_causale_id,
                                                R.id.txt_causale, R.id.txt_conto_id, R.id.txt_conto,
                                                R.id.txt_data, R.id.txt_note });
                lv.setAdapter(adapter);
        }
una volta completate le operazioni in background, dalla activity richiamo questo:
Codice: [Seleziona]
        public void refreshLista() {
                list.clear();
                adapter = null;
                LinearLayout ll = (LinearLayout) getActivity().findViewById(
                                R.id.linear_layou_items);
                ListView newLv = new ListView(getActivity());
                setLista();
                ll.removeAllViews();
                ll.addView(newLv);
        }
i dati sono aggiornati, perchè nella lista ci son oi dati nuovi (come ho mostrato nel post precedente).
eppure fino a che non riavvio l'activity la listview rimane uguale!