Autore Topic: Help, Aggiornare spinner in modo dinamico  (Letto 841 volte)

Offline scardy

  • Nuovo arrivato
  • *
  • Post: 6
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Galaxy S3
  • Sistema operativo:
    Windows 7
Help, Aggiornare spinner in modo dinamico
« il: 23 Dicembre 2012, 11:47:28 CET »
0
Ciao,
ho due classi una Backup e una Restore. In quella backup ho un tasto dove mi salva un file in una directory, Restore invece ha uno spinner con la lista dei file che ho salvato. Vorrei che ogni volta che salvo un file lo spinner si aggiornasse in automatico. Non so piu dove sbattere la testa  >:(

Probabilmente metto nel punto sbagliato notifyDataSetChanged(); o no.. bho ma sono bloccato qui...
Ho dato un occhiata sul forum facendo una ricerca ma non ho trovato nulla di utile e alcuni post erano senza riposta. :(

Backup
Codice (Java): [Seleziona]
public class Backup extends Fragment {

        private static final int PROGRESS = 0x1;

        private ProgressBar mProgress;
        private int mProgressStatus = 0;
        private Handler mHandler = new Handler();
        private Spinner spinner;
        List<String> filenames = new ArrayList<String>();
        ArrayAdapter<String> adapter;

        @Override
        public void onCreate(Bundle savedInstanceState) {
                // TODO Auto-generated method stub
                super.onCreate(savedInstanceState);

        }

        @Override
        public void onActivityCreated(Bundle savedInstanceState) {
                super.onActivityCreated(savedInstanceState);

        }

        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container,
                        Bundle savedInstanceState) {
                final View view = inflater.inflate(R.layout.back_layout, container,
                                false);
                Button btnBck = (Button) view.findViewById(R.id.btnBackup);
                btnBck.setOnClickListener(new View.OnClickListener() {

                        @Override
                        public void onClick(View v) {
                                mProgress = (ProgressBar) view
                                                .findViewById(R.id.progressbar_activity);

                                // spinner = (Spinner) view.findViewById(R.id.lista_profili);
                                mProgress.setVisibility(0);
                                new Thread(new Runnable() {
                                        public void run() {
                                                while (mProgressStatus < 100) {
                                                        mProgressStatus = doWork();
                                                        if (mProgressStatus >= 100) {
                                                                mHandler.post(new Runnable() {// mHandler.post
                                                                                                                               
                                                                        public void run() {
                                                                                View inflatedView = getLayoutInflater(
                                                                                                getArguments()).inflate(
                                                                                                R.layout.restore_layout, null);
                                                                                spinner = (Spinner) inflatedView
                                                                                                .findViewById(R.id.lista_profili);
                                                                                adapter = new ArrayAdapter<String>(
                                                                                                getActivity(),
                                                                                                android.R.layout.simple_spinner_item,
                                                                                                filenames);
                                                                                adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);

                                                                                spinner.setAdapter(adapter);
                                                                                adapter.notifyDataSetChanged();

                                                                                mProgress
                                                                                                .setVisibility(ProgressBar.INVISIBLE);
                                                                        }
                                                                });

                                                        }
                                                }

                                        }

                                        private int doWork() {
                                                // TODO Auto-generated method stub
                                                InputStream in = null;
                                                OutputStream out = null;

                                                // TODO Auto-generated method stub
                                                // File sdcard =
                                                // Environment.getExternalStorageDirectory();
                                                File sdcard2 = Environment.getDataDirectory();
                                                File fileBck = Environment
                                                                .getExternalStorageDirectory();
                                                if (fileBck.canWrite()) {
                                                        EditText nome = (EditText) view
                                                                        .findViewById(R.id.editNameBck);
                                                        // Get the text file
                                                        File file = new File(sdcard2,
                                                                        "/default.profile");

                                                        try {
                                                                File f = new File(fileBck
                                                                                + "/BackupProfile");
                                                                File filedst = new File(f
                                                                                + java.io.File.separator
                                                                                + nome.getText() + ".profile");
                                                                boolean success = false;
                                                                if (!f.exists()) {
                                                                        success = f.mkdir();
                                                                } else {
                                                                        success = true;
                                                                }
                                                                if (success) {
                                                                        copyFile(file, filedst);
                                                                        refreshSpinner();

                                                                }

                                                        } catch (IOException e1) {
                                                                // TODO Auto-generated catch block
                                                                Log.e("Sarelo", "Error creating file", e1);
                                                                return 100;

                                                        }
                                                } else {
                                                        // return 100;
                                                }
                                                return 100;
                                        }

                                        private void copyFile(File file, File dst)
                                                        throws IOException {
                                                // TODO Auto-generated method stub
                                                FileChannel inChannel = new FileInputStream(file)
                                                                .getChannel();
                                                FileChannel outChannel = new FileOutputStream(dst)
                                                                .getChannel();
                                                try {
                                                        inChannel.transferTo(0, inChannel.size(),
                                                                        outChannel);

                                                } finally {
                                                        if (inChannel != null)
                                                                inChannel.close();
                                                        if (outChannel != null)
                                                                outChannel.close();

                                                }
                                                // refreshSpinner();
                                                try {
                                                        File fileBck = Environment
                                                                        .getExternalStorageDirectory();
                                                        File folder = new File(fileBck
                                                                        + "/BackupProfile");

                                                        File[] files = folder.listFiles();

                                                        for (File filez : files) {
                                                                filenames.add(filez.getName());
                                                        }

                                                        // adapter.add("prova");

                                                } catch (Exception e) {
                                                        Log.e("Sarelo", "Error creating file", e);
                                                }

                                        }

                                        private void refreshSpinner() {

                                        }

                                }).start();

                        }

                });
                return view;
        }

}

Restore
Codice (Java): [Seleziona]
public class Restore extends Fragment {

       
        @Override
        public void onCreate(Bundle savedInstanceState) {
                // TODO Auto-generated method stub
                super.onCreate(savedInstanceState);
        }

        /*
         * (non-Javadoc)
         *
         * @see android.support.v4.app.Fragment#onActivityCreated(android.os.Bundle)
         */

        @Override
        public void onActivityCreated(Bundle savedInstanceState) {
                // TODO Auto-generated method stub
                super.onActivityCreated(savedInstanceState);
        }

        /*
         * (non-Javadoc)
         *
         * @see
         * android.support.v4.app.Fragment#onCreateView(android.view.LayoutInflater,
         * android.view.ViewGroup, android.os.Bundle)
         */

        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container,
                        Bundle savedInstanceState) {
                // TODO Auto-generated method stub
                final View view = inflater.inflate(R.layout.restore_layout, container,
                                false);
                File fileBck = Environment.getExternalStorageDirectory();
                File folder = new File(fileBck + "/BackupProfile");
                Spinner spinner = (Spinner) view.findViewById(R.id.lista_profili);
                if (folder.exists()) {
                        File[] files = folder.listFiles();
                        List<String> filenames = new ArrayList<String>();
                        if (files.length > 0) {
                                for (File file : files) {
                                        filenames.add(file.getName());
                                }
                        }

                        ArrayAdapter<String> adapter = new ArrayAdapter<String>(
                                        getActivity(), android.R.layout.simple_spinner_item,
                                        filenames);
                        adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
                        spinner.setAdapter(adapter);

                }
                return view;
        }

}

Offline Ricky`

  • Amministratore
  • Utente storico
  • *****
  • Post: 3489
  • Respect: +506
    • Github
    • Google+
    • rciovati
    • Mostra profilo
Re:Help, Aggiornare spinner in modo dinamico
« Risposta #1 il: 23 Dicembre 2012, 12:11:36 CET »
0
Quindi, se ho capito bene, tu vorresti aggiornare il fragment restore al termine del'operazione nel fragment backup?

In questo caso, il metodo che stai provando non può funzionare, semplicemente perchè non è possibile, da un fragment, accedere alla vista di un altro fragment.

Devi implementare un piccolo meccanismo di comunicazione tra fragment, ti ho abbozzato un po di codice:


Questa è l'activity che contiene il fragment backup e restore:
Codice (Java): [Seleziona]
public class MainActivity extends FragmentActivity {

   //Tutti gli altri metodi, come li hai ora.

   public void notifyBackupDone(){
      FragmentManager fm = getSupportFragmentManager();
      Restore fragmentRestore = // prendi il riferimento al fragment con fm.findFragmentById o fm.findFragmentByTag
      fragmentRestore.updateFilesSpinner();
   }

}

Il fragment backup diventa:

Codice (Java): [Seleziona]
public class Backup extends Fragment {

        private static final int PROGRESS = 0x1;

        private ProgressBar mProgress;
        private int mProgressStatus = 0;
        private Handler mHandler = new Handler();
        private Spinner spinner;
        List<String> filenames = new ArrayList<String>();
        ArrayAdapter<String> adapter;

        @Override
        public void onCreate(Bundle savedInstanceState) {
                // TODO Auto-generated method stub
                super.onCreate(savedInstanceState);

        }

        @Override
        public void onActivityCreated(Bundle savedInstanceState) {
                super.onActivityCreated(savedInstanceState);

        }

        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container,
                        Bundle savedInstanceState) {
                final View view = inflater.inflate(R.layout.back_layout, container,
                                false);
                Button btnBck = (Button) view.findViewById(R.id.btnBackup);
                btnBck.setOnClickListener(new View.OnClickListener() {

                        @Override
                        public void onClick(View v) {
                                mProgress = (ProgressBar) view
                                                .findViewById(R.id.progressbar_activity);

                                // spinner = (Spinner) view.findViewById(R.id.lista_profili);
                                mProgress.setVisibility(0);
                                new Thread(new Runnable() {
                                        public void run() {
                                                while (mProgressStatus < 100) {
                                                        mProgressStatus = doWork();
                                                        if (mProgressStatus >= 100) {
                                                                mHandler.post(new Runnable() {
                                                                        public void run() {
                                                                                //Richiami il metodo dell'activity per notificare all'altro fragment che deve aggiornarsi
                                                                           TuaActivity activity = (TuaActivity) getActivity();
                                                                           activity.notifyBackupDone();
                                                                        }
                                                                });

                                                        }
                                                }

                                        }

                                        private int doWork() {
                                                // TODO Auto-generated method stub
                                                InputStream in = null;
                                                OutputStream out = null;

                                                // TODO Auto-generated method stub
                                                // File sdcard =
                                                // Environment.getExternalStorageDirectory();
                                                File sdcard2 = Environment.getDataDirectory();
                                                File fileBck = Environment
                                                                .getExternalStorageDirectory();
                                                if (fileBck.canWrite()) {
                                                        EditText nome = (EditText) view
                                                                        .findViewById(R.id.editNameBck);
                                                        // Get the text file
                                                        File file = new File(sdcard2,
                                                                        "/default.profile");

                                                        try {
                                                                File f = new File(fileBck
                                                                                + "/BackupProfile");
                                                                File filedst = new File(f
                                                                                + java.io.File.separator
                                                                                + nome.getText() + ".profile");
                                                                boolean success = false;
                                                                if (!f.exists()) {
                                                                        success = f.mkdir();
                                                                } else {
                                                                        success = true;
                                                                }
                                                                if (success) {
                                                                        copyFile(file, filedst);
                                                                        refreshSpinner();

                                                                }

                                                        } catch (IOException e1) {
                                                                // TODO Auto-generated catch block
                                                                Log.e("Sarelo", "Error creating file", e1);
                                                                return 100;

                                                        }
                                                } else {
                                                        // return 100;
                                                }
                                                return 100;
                                        }

                                        private void copyFile(File file, File dst)
                                                        throws IOException {
                                                // TODO Auto-generated method stub
                                                FileChannel inChannel = new FileInputStream(file)
                                                                .getChannel();
                                                FileChannel outChannel = new FileOutputStream(dst)
                                                                .getChannel();
                                                try {
                                                        inChannel.transferTo(0, inChannel.size(),
                                                                        outChannel);

                                                } finally {
                                                        if (inChannel != null)
                                                                inChannel.close();
                                                        if (outChannel != null)
                                                                outChannel.close();

                                                }
                                                // refreshSpinner();
                                                try {
                                                        File fileBck = Environment
                                                                        .getExternalStorageDirectory();
                                                        File folder = new File(fileBck
                                                                        + "/BackupProfile");

                                                        File[] files = folder.listFiles();

                                                        for (File filez : files) {
                                                                filenames.add(filez.getName());
                                                        }

                                                        // adapter.add("prova");

                                                } catch (Exception e) {
                                                        Log.e("Sarelo", "Error creating file", e);
                                                }

                                        }

                                        private void refreshSpinner() {

                                        }

                                }).start();

                        }

                });
                return view;
        }

}

Codice (Java): [Seleziona]
public class Restore extends Fragment {

       
        @Override
        public void onCreate(Bundle savedInstanceState) {
                // TODO Auto-generated method stub
                super.onCreate(savedInstanceState);
        }

        /*
         * (non-Javadoc)
         *
         * @see android.support.v4.app.Fragment#onActivityCreated(android.os.Bundle)
         */

        @Override
        public void onActivityCreated(Bundle savedInstanceState) {
                // TODO Auto-generated method stub
                super.onActivityCreated(savedInstanceState);
        }

        public void updateFilesSpinner(){
           //Qui dentro metti il codice per aggiornare lo spinner
        }

        /*
         * (non-Javadoc)
         *
         * @see
         * android.support.v4.app.Fragment#onCreateView(android.view.LayoutInflater,
         * android.view.ViewGroup, android.os.Bundle)
         */

        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container,
                        Bundle savedInstanceState) {
                // TODO Auto-generated method stub
                final View view = inflater.inflate(R.layout.restore_layout, container,
                                false);
                File fileBck = Environment.getExternalStorageDirectory();
                File folder = new File(fileBck + "/BackupProfile");
                Spinner spinner = (Spinner) view.findViewById(R.id.lista_profili);
                if (folder.exists()) {
                        File[] files = folder.listFiles();
                        List<String> filenames = new ArrayList<String>();
                        if (files.length > 0) {
                                for (File file : files) {
                                        filenames.add(file.getName());
                                }
                        }

                        ArrayAdapter<String> adapter = new ArrayAdapter<String>(
                                        getActivity(), android.R.layout.simple_spinner_item,
                                        filenames);
                        adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
                        spinner.setAdapter(adapter);

                }
                return view;
        }

}  

Spero di essere stato sufficientemente chiaro :)


PS: Nel fragment restore, il caricamento della lista dei file ti conviene farlo in modo asincrono tramite, ad esempio, un AsyncTask. In questo modo velocizzeresti la creazione del fragment stesso :)
« Ultima modifica: 23 Dicembre 2012, 12:13:14 CET da Ricky` »

Offline scardy

  • Nuovo arrivato
  • *
  • Post: 6
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Galaxy S3
  • Sistema operativo:
    Windows 7
Re:Help, Aggiornare spinner in modo dinamico
« Risposta #2 il: 23 Dicembre 2012, 12:14:37 CET »
0
Grazie mille!. Provo subito e ti faro sapere ^^

 /bow

Offline scardy

  • Nuovo arrivato
  • *
  • Post: 6
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Galaxy S3
  • Sistema operativo:
    Windows 7
Re:Help, Aggiornare spinner in modo dinamico
« Risposta #3 il: 23 Dicembre 2012, 13:51:45 CET »
0
Hmmmm ho fatto come mi hai detto, pero' non capisco una cosa...(scusa l'ignoranza <.<)
Codice (Java): [Seleziona]
public class MainActivity extends FragmentActivity {

   //Tutti gli altri metodi, come li hai ora.

   public void notifyBackupDone(){
      FragmentManager fm = getSupportFragmentManager();
      Restore fragmentRestore = // prendi il riferimento al fragment con fm.findFragmentById o fm.findFragmentByTag
      fragmentRestore.updateFilesSpinner();
   }

}

Restore fragmentRestore = // prendi il riferimento al fragment con fm.findFragmentById o fm.findFragmentByTag
Non mi pare di aver messo un id al fragment.
Forse dovrei mettere nell layout del restore un Fragment?
ho un po ' di confusione  O:-)

Offline Ricky`

  • Amministratore
  • Utente storico
  • *****
  • Post: 3489
  • Respect: +506
    • Github
    • Google+
    • rciovati
    • Mostra profilo
Re:Help, Aggiornare spinner in modo dinamico
« Risposta #4 il: 23 Dicembre 2012, 15:06:40 CET »
0
Come aggiungi il fragment?

Offline scardy

  • Nuovo arrivato
  • *
  • Post: 6
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Galaxy S3
  • Sistema operativo:
    Windows 7
Re:Help, Aggiornare spinner in modo dinamico
« Risposta #5 il: 23 Dicembre 2012, 15:10:11 CET »
0
Come aggiungi il fragment?
dal Layout del restore ho aggiunto queste righe (per provare)
Codice (XML): [Seleziona]
<fragment
       android:id="@+id/fragmentRestore"
       android:name="com.scardy.Restore"
       android:layout_width="match_parent"
       android:layout_height="wrap_content"
       tools:layout="@android:layout/simple_spinner_dropdown_item" />

e poi ho modificato
Codice (Java): [Seleziona]
public void notifyBackupDone(){
              FragmentManager fm = getSupportFragmentManager();
              Restore fragmentRestore = (Restore) fm.findFragmentById(R.id.fragmentRestore); // prendi il riferimento al fragment con fm.findFragmentById o fm.findFragmentByTag
              fragmentRestore.updateFilesSpinner();
           }
Ma quando lo faccio partire esplode tutto  :-[

Offline Ricky`

  • Amministratore
  • Utente storico
  • *****
  • Post: 3489
  • Respect: +506
    • Github
    • Google+
    • rciovati
    • Mostra profilo
Re:Help, Aggiornare spinner in modo dinamico
« Risposta #6 il: 23 Dicembre 2012, 19:09:37 CET »
0
Ma scusa, tu prima come li inserivi questi fragment?

Offline scardy

  • Nuovo arrivato
  • *
  • Post: 6
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Galaxy S3
  • Sistema operativo:
    Windows 7
Re:Help, Aggiornare spinner in modo dinamico
« Risposta #7 il: 23 Dicembre 2012, 22:34:00 CET »
0
Allora ho aggiustato un po' il tutto. Ho aggiunto i fragment. solo che ora
Codice (Java): [Seleziona]
 
FragmentManager fm = getSupportFragmentManager();
Restore fragmentRestore = (Restore) fm.findFragmentById(R.id.frmRestore); // prendi il riferimento al fragment con fm.findFragmentById o fm.findFragmentByTag
fragmentRestore.updateFilesSpinner();

fragmentRestore mi da sempre null

Offline Ricky`

  • Amministratore
  • Utente storico
  • *****
  • Post: 3489
  • Respect: +506
    • Github
    • Google+
    • rciovati
    • Mostra profilo
Re:Help, Aggiornare spinner in modo dinamico
« Risposta #8 il: 24 Dicembre 2012, 09:26:29 CET »
0
Se però non rispondi a quello che ti chiedo, mi dispiace ma non posso aiutarti.

Offline scardy

  • Nuovo arrivato
  • *
  • Post: 6
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Galaxy S3
  • Sistema operativo:
    Windows 7
Re:Help, Aggiornare spinner in modo dinamico
« Risposta #9 il: 24 Dicembre 2012, 11:02:17 CET »
0
Ma scusa, tu prima come li inserivi questi fragment?
Non avevo fatto i file xml con i fragment. Pensavo li avesso creati il progetto in automatico, invece non ha fatto nulla ???