Autore Topic: Problema Refresh ListView  (Letto 543 volte)

Offline theberserk

  • Nuovo arrivato
  • *
  • Post: 19
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    HTC Legend Rooted with Froyo and Sense
  • Sistema operativo:
    Windows with Eclpise plugin
Problema Refresh ListView
« il: 22 Febbraio 2011, 09:51:27 CET »
0
Ciao a tutti, apro una nuova discussione perchè cercando tra le presenti sull'argomento non sono riuscito a trovare una soluzione.
Del codice che segue, sono importanti solo i metodi refreshDir(), ed onOptionsMenuSelected , oltre all' onCreate() dove ovviamente inizializzo il tutto. Semplicemente cambiando i dati che l'ArrayAdapter utilizza ed andando a chiamare il notifyDataSetChanged() la ListView non viene aggiornata. Qualcuno ha idea del perchè? Grazie mille
Codice (Java): [Seleziona]
public class CrispAppMainActivity extends Activity {
       
        private Dialog aboutDialog;
       
        ListView lv;
        ArrayAdapter<String> adapter;

        String result = "";
        HttpClient client = null;

        boolean done = false;

        private final static String FILE_PATH = "/it.crisp.reports/reports/";
        private final static String FILE_NAME = "report.xml";
        private final static int DOWNLOAD_OPTION_MENU = 0;
        private final static int ABOUT_OPTION_MENU = 1;
        private final static int REFRESH_OPTION_MENU = 2;
        private final static int DELETE_OPTION_MENU = 3;
        private final static int VIEW_OPTION_MENU = 4;
        private final static int ABOUT_DIALOG = 0;

        private ProgressDialog pd;

        // Variabili per la scrittura del report nella scheda SD
        File sdCard;
        File xmlToFile;
        FileOutputStream fos;
        DataOutputStream dos;

        // Variabili per la lettura da scheda SD
        File xmlFromFile;
        FileInputStream fis;
        DataInputStream dis;
        String[] files;

        public void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                setContentView(R.layout.main_layout);
                sdCard = new File(Environment.getExternalStorageDirectory() + FILE_PATH);
                refreshDir();
                adapter = new ArrayAdapter<String>(this,
                                R.layout.main_list_row, R.id.main_list_row_text, files);
                lv = (ListView) findViewById(R.id.main_list);          
                lv.setAdapter(adapter);
                registerForContextMenu(lv);
        }

        public boolean onCreateOptionsMenu(Menu menu) {
                menu.add(Menu.FIRST, DOWNLOAD_OPTION_MENU, Menu.FIRST,
                                R.string.menu_download).setIcon(R.drawable.download);
                menu.add(Menu.FIRST + 1, ABOUT_OPTION_MENU, Menu.FIRST + 1,
                                R.string.menu_about);
                menu.add(Menu.FIRST+2, REFRESH_OPTION_MENU, Menu.FIRST+2, R.string.menu_refresh);
                return true;
        }      
       
        public boolean onOptionsItemSelected(MenuItem item) {
                // Dobbiamo gestire l'Intent in questo modo perchè lo dobbiamo
                // eseguire con o startActivityForResult e non semplicemente come
                // Intent
                switch (item.getItemId()) {
                case DOWNLOAD_OPTION_MENU:
                        pd = ProgressDialog.show(CrispAppMainActivity.this,
                                        "XML Report Download", "Connecting...", true, false);
                        HttpGetTask task = new HttpGetTask();
                        task.execute("report.xml");
                        return true;
                case ABOUT_OPTION_MENU:
                        aboutDialog = aboutDialog("CRISP Reports");
                        showDialog(ABOUT_DIALOG);
                        return true;
                case REFRESH_OPTION_MENU:
                        refreshDir();                  
                        adapter.notifyDataSetChanged();                
                        return true;
                default:
                        return false;

                }
        }
       
        public void onCreateContextMenu(ContextMenu menu, View v,
                        ContextMenuInfo menuInfo) {
                if (v.getId() == R.id.main_list) {
                        int group = Menu.FIRST;
                        menu.add(group, VIEW_OPTION_MENU, Menu.FIRST, R.string.view_opt);
                        menu.add(group, DELETE_OPTION_MENU, Menu.FIRST + 1,
                                        R.string.del_opt);                     
                }

        }
       
        public boolean onContextItemSelected(MenuItem item) {
                AdapterContextMenuInfo info = (AdapterContextMenuInfo) item
                                .getMenuInfo();
                int fileId = (int) info.id;
                switch (item.getItemId()) {
                case VIEW_OPTION_MENU:
                        Intent viewIntent = new Intent(this, ViewDataSetActivity.class);
                        viewIntent.putExtra("pathFile", sdCard + "/" + files[fileId]);
                        startActivity(viewIntent);
                        return true;
                case DELETE_OPTION_MENU:
                        return true;
                default:
                        return false;
                }
        }

        public class HttpGetTask extends AsyncTask<String, String, String> {
                @Override
                protected String doInBackground(String... params) {

                        String xmlfile = params[0];

                        try {
                                // Construct data
                                String data = URLEncoder.encode("key1", "UTF-8") + "="
                                                + URLEncoder.encode("value1", "UTF-8");
                                data += "&" + URLEncoder.encode("key2", "UTF-8") + "="
                                                + URLEncoder.encode("value2", "UTF-8");

                                // Send data
                                publishProgress("Creating HTTP client and query...");
                                URL url = new URL("http://news.nordelettrica.it/xml/" + xmlfile);
                                URLConnection conn = url.openConnection();
                                conn.setDoOutput(true);
                                OutputStreamWriter wr = new OutputStreamWriter(
                                                conn.getOutputStream());
                                wr.write(data);
                                wr.flush();

                                // Get the response
                                publishProgress("Downloading...");
                                BufferedReader rd = new BufferedReader(new InputStreamReader(
                                                conn.getInputStream()));
                                String line;
                                while ((line = rd.readLine()) != null) {
                                        result += line;
                                        Log.v("FILE_LINE", line);
                                }
                                wr.close();
                                rd.close();
                                done = true;
                        } catch (Exception e) {
                                publishProgress("Error during Download: " + e.toString());
                        } finally {
                                if (client != null)
                                        client.getConnectionManager().shutdown();
                        }
                        publishProgress("Writing data to storage...");
                        if (!sdCard.exists() && !sdCard.isDirectory()) { // Creo la
                                                                                                                                // directory se
                                                                                                                                // non esiste
                                sdCard.mkdirs();
                        }
                        try {
                                xmlToFile = new File(sdCard, FILE_NAME);
                                fos = new FileOutputStream(xmlToFile);
                                dos = new DataOutputStream(fos);
                                // dos.writeBytes(result);
                                dos.write(result.getBytes());
                                dos.close();
                        } catch (FileNotFoundException e) {
                                // TODO Auto-generated catch block
                                publishProgress(e.toString());
                                Log.e("FileStream:", e.toString());
                                done = false;
                        } catch (IOException e) {
                                // TODO Auto-generated catch block
                                publishProgress(e.toString());
                                Log.e("FileStream:", e.toString());
                                done = false;
                        }

                        return result;
                }

                @Override
                protected void onProgressUpdate(String... values) {
                        // aggiorno la progress dialog
                        pd.setMessage(values[0]);
                }

                protected void onPostExecute(String result) {
                        // Mostro l'esito dell'operazione con un Toast
                        if (done)
                                showToast("XML Report succesfully downloaded");
                        else
                                showToast("Error during downloading");
                        // chiudo la progress dialog                   
                        pd.dismiss();                  
                }
        }
       

        public void showToast(String text) {
                Toast toast = Toast.makeText(this, text, Toast.LENGTH_SHORT);
                toast.show();
        }
       
        protected Dialog onCreateDialog(int id){
                switch (id) {
                case ABOUT_DIALOG:
                        onPrepareDialog(id, aboutDialog);
                        return aboutDialog;
                default:
                        return null;
                }
        }
       
        private Dialog aboutDialog(String title) {
                Dialog commDialog = new Dialog(this);
                commDialog.setTitle(title);
                commDialog.setContentView(R.layout.dialog_layout);             
                return commDialog;
        }
       
        private void refreshDir(){
                try {
                        fis = new FileInputStream(sdCard);
                        dis = new DataInputStream(fis);
                        files = sdCard.list();
                } catch (FileNotFoundException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                }
        }

}

Ed il layout dell'activity è il seguente:
Codice (XML): [Seleziona]
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="fill_parent" android:layout_height="fill_parent"
        android:orientation="vertical">

        <TextView android:text="CRISP Reports" android:textSize="25sp"
                android:background="@color/white" android:textColor="@color/green"
                android:textStyle="bold" android:id="@+id/dataset_view_title"
                android:layout_width="fill_parent" android:layout_height="wrap_content"
                android:gravity="center_horizontal" />
        <TextView android:text="@string/welcome_message" android:id="@+id/welcome_text"
                android:gravity="center_horizontal" android:layout_width="fill_parent"
                android:layout_height="wrap_content"></TextView>
        <TextView android:text="@string/header_message1" android:id="@+id/TextView01"
                android:paddingTop="5sp" android:layout_width="wrap_content"
                android:layout_height="wrap_content"></TextView>
        <TextView android:text="@string/header_message2" android:id="@+id/TextView02"
                android:layout_width="wrap_content" android:layout_height="wrap_content"></TextView>
        <ListView android:layout_width="fill_parent"
                android:layout_height="wrap_content" android:paddingTop="5sp"
                android:id="@+id/main_list"></ListView>
</LinearLayout>