Autore Topic: Aggiornare TextView in Fragment  (Letto 400 volte)

Offline nicozumel

  • Nuovo arrivato
  • *
  • Post: 43
  • Respect: +5
    • Mostra profilo
  • Dispositivo Android:
    Huawei - P7
  • Sistema operativo:
    Windows 7
Aggiornare TextView in Fragment
« il: 17 Giugno 2014, 18:08:11 CEST »
0
Ciao a tutti,
ho un problema, chissà banale, ma non riesco ad aggiornare il testo di un textView interno ad un Fragment.
Nel Layout presento un bottone e una serie di textView da valorizzare.
Al click del bottone viene aperto un asyncTask che esegue una query contenuta in un file .php su 'localhost'  che restituisce un JSONArray con i dati da visualizzare nei vari TextView.
All'esecuzione del metodo 'onPostExecute' reperisco l'array Json in input e setto infine i textView del Fragment. Ma niente, il testo di quest'ultimi non viene cambiato.
L'array viene regolarmente passato al metodo onPostExecute valorizzato e corretto.
Vi posto solo la parte di codice interessata:
FRAGMENT:
Codice: [Seleziona]
public static class inserimento extends Fragment
    {
            static TextView loading;
           
        private static final String ARG_SECTION_NUMBER = "section_number";

        public static inserimento newInstance(int sectionNumber)
        {
            inserimento fragment = new inserimento();
            Bundle args = new Bundle();
            args.putInt(ARG_SECTION_NUMBER, sectionNumber);
            fragment.setArguments(args);
            return fragment;
        }

        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container,
                Bundle savedInstanceState)
        {
           View rootView = inflater.inflate(R.layout.inserimento, container, false);
           Button connettiBut = (Button) rootView.findViewById(R.id.button1);
           loading = (TextView) rootView.findViewById(R.id.textView2);
   
           connettiBut.setOnClickListener(new OnClickListener(){
                   @Override
                   public void onClick(View arg0)
                   {
                           DownloadTask dlTask = new DownloadTask();
                           dlTask.execute();
                     };
           });
            return rootView;
        }
Poi definisco l'ASYNCTASK e il metodo (retrieve) che recupera i dati via http:
Codice: [Seleziona]
      class DownloadTask extends AsyncTask<Void, Void, JSONArray>
      {
            protected JSONArray doInBackground(Void... arg0)
            {
                return retrieve();
            }
           
            protected void onPostExecute(JSONArray risultati)
            {
                     try {
                                        JSONObject json_data = risultati.getJSONObject(0);
                                        String help = json_data.getString("idArticolo");
                                        loading.setText(help);
                                }
                    catch (JSONException e)
                    {        e.printStackTrace();                }
                   
            }

                       
        }
       
        public JSONArray retrieve()
        {
                String result = "";
                 ArrayList<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();
                nameValuePairs.add(new BasicNameValuePair("idart","1234567"));
                InputStream is = null;
                 
                try{
                        HttpClient httpclient = new DefaultHttpClient();
                        HttpPost httppost = new HttpPost("http://10.0.2.2/Crysis/newfile.php"); /* For Localhost*/
                        httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
                        HttpResponse response = httpclient.execute(httppost);
                        HttpEntity entity = response.getEntity();
                        is = entity.getContent();
                }catch(Exception e){
                        Log.e("log_tag", "Error in http connection "+e.toString());
                }
                //convert response to string
                try{
                        BufferedReader reader = new BufferedReader(new InputStreamReader(is,"iso-8859-1"),8);
                        StringBuilder sb = new StringBuilder();
                        String line = null;
                        while ((line = reader.readLine()) != null) {
                                sb.append(line + "\n");
                        }
                        is.close();

                        result=sb.toString();
                }catch(Exception e){
                        Log.e("log_tag", "Error converting result "+e.toString());
                }

                //parse json data
                try{
                        JSONArray jArray = new JSONArray(result);
                       
                        for(int i=0;i<jArray.length();i++){
                                JSONObject json_data = jArray.getJSONObject(i);
                                Log.i("log_tag","id: "+json_data.getInt("idArticolo")+
                                        ", name: "+json_data.getString("NomeArt")+
                                        ", marca: "+json_data.getString("MarcaArt")+
                                        ", barcode: "+json_data.getInt("BarCodeart")
                                );
                        }
                       
                return jArray;
               
              }
            catch(JSONException e)
            {
            Log.e("log_tag", "Error parsing data "+e.toString());
            }
                        return null;
           }
Ringrazio in anticipo per qualsiasi suggerimento
Buona serata.
Nicola


Offline bradipao

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 4043
  • keep it simple
  • Respect: +567
    • Github
    • Google+
    • bradipao
    • Mostra profilo
  • Dispositivo Android:
    Nexus 5
  • Play Store ID:
    Bradipao
  • Sistema operativo:
    W7
Re:Aggiornare TextView in Fragment
« Risposta #1 il: 17 Giugno 2014, 19:04:50 CEST »
0
Secondo me è perchè l'AsyncTask non conosce il Context in cui cercare la TextView. Un metodo potrebbe essere implementare un listener nel fragment e passarlo all'asynctask, un altro molto grezzo potrebbe essere passare all'asynctask (in fase di creazione) il riferimento alla textview da aggiornare. Un compromesso molto semplice potrebbe essere dichiarare l'asynctask dentro alla classe fragment, così il contesto dovrebbe averlo e il tuo codice dovrebbe funzionare senza altre aggiunte.
NON rispondo a domande nei messaggi privati
Bradipao @ Play Store

Offline nicozumel

  • Nuovo arrivato
  • *
  • Post: 43
  • Respect: +5
    • Mostra profilo
  • Dispositivo Android:
    Huawei - P7
  • Sistema operativo:
    Windows 7
Re:Aggiornare TextView in Fragment
« Risposta #2 il: 18 Giugno 2014, 16:26:28 CEST »
0
Un compromesso molto semplice potrebbe essere dichiarare l'asynctask dentro alla classe fragment, così il contesto dovrebbe averlo e il tuo codice dovrebbe funzionare senza altre aggiunte.
Ciao,
è gia dentro la classe fragment:
Struttura dcel codice:
Codice: [Seleziona]
public static class inserimento extends Fragment
    {
        public static inserimento newInstance(int sectionNumber)
        {
                ...
        }
        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container,
                Bundle savedInstanceState)
        {
        ...
           connettiBut.setOnClickListener(new OnClickListener(){
                   @Override
                   public void onClick(View arg0)
                   {
                           DownloadTask dlTask = new DownloadTask();
                           dlTask.execute();
                   };
           });
            return rootView;
        }
       
        class DownloadTask extends AsyncTask<Void, Void, JSONArray>
        {
            protected JSONArray doInBackground(Void... arg0)
            {
            return retrive();
            }

            protected void onPostExecute(JSONArray risultati)
            {
             ...
            }
        }

        public JSONArray retrive()
        {
           ...
            return jArray;
        }
}



Post unito: [time]18 Giugno 2014, 16:42:20 CEST[/time]
un metodo potrebbe essere passare all'asynctask (in fase di creazione) il riferimento alla textview da aggiornare.

Ho provato anche con questo ma niente, il textview non viene cambiato, posto il codice modificato con il passaggio della textview:
Codice: [Seleziona]
public static class inserimento extends Fragment
    {
            static TextView loading;
           
        private static final String ARG_SECTION_NUMBER = "section_number";

        public static inserimento newInstance(int sectionNumber)
        {
                inserimento fragment = new inserimento();
            Bundle args = new Bundle();
            args.putInt(ARG_SECTION_NUMBER, sectionNumber);
            fragment.setArguments(args);
            return fragment;
        }

        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container,
                Bundle savedInstanceState)
        {
           View rootView = inflater.inflate(R.layout.inserimento, container, false);
           Button connettiBut = (Button) rootView.findViewById(R.id.button1);
           loading = (TextView) rootView.findViewById(R.id.textView2);
   
           connettiBut.setOnClickListener(new OnClickListener(){
                   @Override
                   public void onClick(View arg0)
                   {
                           TextView[] myTaskParams = { loading };
                           DownloadTask dlTask = new DownloadTask();
                           dlTask.execute(myTaskParams);
               
                   };
           });
            return rootView;
        }

        class DownloadTask extends AsyncTask<TextView, Void, JSONArray>
        {
                TextView help = null;

                protected JSONArray doInBackground(TextView... arg0)
            {
                 help = arg0[0];
                 return retrive();
            }
           
             protected void onPostExecute(JSONArray risultati)
            {
                       try {
                                        JSONObject json_data = risultati.getJSONObject(0);
                                        String help = json_data.getString("idArticolo");
                                        this.help.setText(help);
                         }
                     catch (JSONException e)
                    {
                                        e.printStackTrace();
                                }
                   
                     
            }

                       
        }
       
        public JSONArray retrive()
        {
                  ...
                    ...     
                        return jArray;
           }
        }

Post unito: 18 Giugno 2014, 16:46:23 CEST
Secondo me è perchè l'AsyncTask non conosce il Context in cui cercare la TextView. Un metodo potrebbe essere implementare un listener nel fragment e passarlo all'asynctask
Bradipao, scusa ma questo suggerimento non l'ho capito molto, potresti specificare un po.
Grazie mille.
Nicola
« Ultima modifica: 18 Giugno 2014, 16:46:23 CEST da nicozumel, Reason: Merged DoublePost »