Autore Topic: Refresh fragment  (Letto 766 volte)

Offline Jackpot21

  • Nuovo arrivato
  • *
  • Post: 2
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    sgs2
  • Sistema operativo:
    mac os x 10.8.2
Refresh fragment
« il: 22 Febbraio 2013, 09:58:06 CET »
0
Buon giorno a tutti!
Sto sviluppando una piccola app che richiede l'uso dei fragment e di un tabListener..
I fragment utilizzati sono due : uno che contiene una listview con dati provenienti da un DB, l'altro contiene dei campi che vengono riempiti al tap
di un elemento dell lista..

La lista ha un footer con 4 semplici button per la paginazione (inizio,fine,avanti,indietro)..
Il problema è che quando, ad esmpio, tappo  su avanti, la lista non viene refreshata, se vado in debug, vedo che da codice è tutto ok,
mi "crea" i record della pagina successiva, ma non vengono visualizzati nella UI..se però rilancio l'activity contenente i due fragment, la lista mi mostra i record della pagina successiva..

Qualcuno saprebbe aiutarmi?

Grazie mille!!

Posto qui parte del codice.

Riempio l'adapter con i valori e l'assegno alla listview
Codice (Java): [Seleziona]
                        for (int i = precRec; i < maxRec * nPagina; i++) {
                                Node c = notes.item(i);
                                nRec = Integer.parseInt(notes.item(i).getAttributes()
                                                .getNamedItem("numero").getTextContent().toString());
                                if (c.getNodeType() == Node.ELEMENT_NODE) {
                                        NodeList noteDetails = c.getChildNodes();
                                        record = "Record " + String.valueOf(i + precRec);
                                        for (int j = 0; j < 1; j++) {
                                                Node c1 = noteDetails.item(j);
                                               
                                                if (c1.getNodeType() == Node.ELEMENT_NODE) {
                                                        String nodeName = c1.getNodeName();
                                                        String nodeValue;
                                                        try {
                                                                nodeValue = c1.getFirstChild().getNodeValue();
                                                        } catch (Exception e) {
                                                                // TODO: handle exception
                                                                nodeValue = "";
                                                        }
                                                        record = record + nodeName + " -> " + nodeValue;
                                                       

                                                }
                                                // lista dei singoli campi
                                                if (pref.equals("Singoli Campi")) {
                                                        myArrayAdapter.add(record);
                                                }

                                        }
                                        // lista dei record
                                        if (!(pref.equals("Singoli Campi"))) {
                                                myArrayAdapter.add(record);
                                        }

                                }

                        }
                        // aggiungo il footer per il paging
                        View footer = ((LayoutInflater) getActivity().getSystemService(
                                        Context.LAYOUT_INFLATER_SERVICE)).inflate(
                                        R.layout.footer_list, null, false);
                        vListView.addFooterView(footer);
                        vListView.setAdapter(myArrayAdapter);
                        vListView.setEnabled(true);
                } else {
                        myArrayAdapter.add("Tabella Vuota");
                        vListView.setAdapter(myArrayAdapter);
                        vListView.setEnabled(false);

                }
// qui c'è vListView.setOnItemClickListener(new OnItemClickListener() .. [..]

mLayout.addView(vListView);

Codice per il controllo del footer (per ora stavo provando solo su il button "avanti")

Codice (Java): [Seleziona]
        private void controlFooter() {
                ImageButton btnInizio = (ImageButton) myFragmentView
                                .findViewById(R.id.imgBtnInizio);

                btnInizio.setOnClickListener(new OnClickListener() {

                        @Override
                        public void onClick(View v) {
                                // TODO Auto-generated method stub
                                Toast.makeText(mContext, "Click su Inizio", Toast.LENGTH_SHORT)
                                                .show();
                        }
                });

                ImageButton btnFine = (ImageButton) myFragmentView
                                .findViewById(R.id.imgBtnFine);

                btnFine.setOnClickListener(new OnClickListener() {

                        @Override
                        public void onClick(View v) {
                                // TODO Auto-generated method stub
                                Toast.makeText(mContext, "Click su Fine", Toast.LENGTH_SHORT)
                                                .show();
                        }
                });

                ImageButton btnAvanti = (ImageButton) myFragmentView
                                .findViewById(R.id.imgBtnAvanti);

                btnAvanti.setOnClickListener(new OnClickListener() {

                        @Override
                        public void onClick(View v) {
                                // TODO Auto-generated method stub
                                if ((nRec < totRec)) {
                                        nPagina = nPagina + 1;
                                        precRec = precRec + maxRec;
                                        creaLista(myInflater, myContainer);

                                } else {
                                        Toast.makeText(mContext, "Sei arrivato alla Fine!",
                                                        Toast.LENGTH_SHORT).show();
                                }

                        }
                });

                ImageButton btnIndietro = (ImageButton) myFragmentView
                                .findViewById(R.id.imgBtnIndietro);

                btnIndietro.setOnClickListener(new OnClickListener() {

                        @Override
                        public void onClick(View v) {
                                // TODO Auto-generated method stub
                                Toast.makeText(mContext, "Click su Indietro",
                                                Toast.LENGTH_SHORT).show();
                        }
                });

        }

Il tabListener:

Codice (Java): [Seleziona]
public class MyTabsListener implements TabListener {
        public android.app.Fragment fragment;

        public MyTabsListener(android.app.Fragment fragment) {
                this.fragment = fragment;
        }

        @Override
        public void onTabReselected(Tab tab, android.app.FragmentTransaction ft) {
                // TODO Auto-generated method stub
        }

        @Override
        public void onTabSelected(Tab tab, android.app.FragmentTransaction ft) {
                // TODO Auto-generated method stub
                ft.replace(R.id.tab, fragment);
        }

        @Override
        public void onTabUnselected(Tab tab, android.app.FragmentTransaction ft) {
                // TODO Auto-generated method stub
                ft.remove(fragment);
        }

}

onCreate della MainActivity:

Codice (Java): [Seleziona]
@Override
        protected void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                setContentView(R.layout.activity_main);

                // ActionBar
                ActionBar actionbar = getActionBar();
                actionbar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);

                ActionBar.Tab ListaTab = actionbar.newTab().setText("Lista")
                                .setTag("lista");
                ActionBar.Tab CampiTab = actionbar.newTab().setText("Campi")
                                .setTag("campi");

                Fragment ListaFragment = new ListaFragment(MainActivity.this);
                Fragment CampiFragment = new CampiFragment();

                ListaTab.setTabListener(new MyTabsListener(ListaFragment));
                CampiTab.setTabListener(new MyTabsListener(CampiFragment));

                actionbar.addTab(ListaTab);
                actionbar.addTab(CampiTab);

        }

Se ci sono modi diversi d'implementazione sono disposto cambiare anche tutto il codice..sto imparando ;)

Post unito: 22 Febbraio 2013, 16:04:10 CET
Mi rispondo da solo e posto la soluzione in caso servisse ad altri:

il problema non è il refresh del fragment, ma della listView, o meglio, dell'arrayadapter della listview.

Ho risolto così:

Ho queste variabili:
Codice (Java): [Seleziona]
        ArrayAdapter<String> myArrayAdapter;
        ArrayList<String> myListItems;
        ListView vListView;

Creo due Runnable, uno che mi riempie l' ArrayList e che mi lancia il secondo Runnable:
Codice (Java): [Seleziona]
// Resetto l'array
                        myListItems = new ArrayList<String>();
               
                        for (int i = precRec; i < toRec; i++) {
                                                [ ... ]
                                                        myListItems.add(record);
                                                }                              
                        }

                        vListView.setEnabled(true);

                        getActivity().runOnUiThread(returnRes);

L'altro che mi carica l'ArrayAdapter con i valori dell'arraylist:
Codice (Java): [Seleziona]
        private Runnable returnRes = new Runnable() {
                @Override
                public void run() {
                        myArrayAdapter.clear();
                       
                        if (myListItems != null && myListItems.size() > 0) {
                                for (int i = 0; i < myListItems.size(); i++)
                                        myArrayAdapter.add(myListItems.get(i));
                        }

                        // dico all'arrayadapter che sono cambiati i dati e quindi necessita di un refresh
                        myArrayAdapter.notifyDataSetChanged();

                }
        };

Così funziona.
Il trucco sta nel
Codice (Java): [Seleziona]
getActivity().runOnUiThread(returnRes);
In quanto per aggiornare la UI, bisogna essere nel Thread della stessa UI (cosa che può sembrare ovvia, ma prima non sapevo manco esistesse runOnUiThread xD)

Con le due Runnable, nella onCreate del fragment non mi resta che creare il footer prendendolo da un layout xml, ed avviare il primo Runnable:
(loadMoreListItems è il nome del primo Runnable)
Codice (Java): [Seleziona]
myListItems = new ArrayList<String>();
                myArrayAdapter = new ArrayAdapter<String>(mContext,
                                android.R.layout.simple_list_item_1, myListItems);

                vListView = new ListView(mContext);

                View footer = ((LayoutInflater) getActivity().getSystemService(
                                Context.LAYOUT_INFLATER_SERVICE)).inflate(R.layout.footer_list,
                                null, false);
                vListView.addFooterView(footer);
                vListView.setAdapter(myArrayAdapter);

                Thread thread = new Thread(null, loadMoreListItems);
                thread.start();

Spero che in futuro serva a qualcuno ;)

Grazie a tutti!! :P
« Ultima modifica: 22 Febbraio 2013, 16:05:29 CET da Jackpot21, Reason: Merged DoublePost »