Autore Topic: Listview Asynctask e customadapter  (Letto 649 volte)

Offline Kr1stian_17

  • Nuovo arrivato
  • *
  • Post: 14
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    XPERIA ARC S
Listview Asynctask e customadapter
« il: 04 Gennaio 2013, 12:41:50 CET »
0
Allora ragazzi. Sto facendo un pò di esperimenti con Asynctask, listview e customadapter. Premetto che gestendo il tutto con delle semplici Textview non ho avuto alcun problema (ovviamente). Ora mi trovo un pò impasticciato. In poche parole nel mio task vado a prelevare dei dati che devo andare ad usare per popolare una listview. Il problema è che in fase di creazione di istanza del mio custom adapter mi da degli errori strani sul "context" che proprio non riesco a capire. Ho cercato la documentazione ma lo stesso sono impantanato.. e sono sicurissimo si tratti di una scemenza.
nella mia fase finale dell'Asynctask ho
Codice (Java): [Seleziona]
 protected void onPostExecute(final List<String> list) {
                ListView listView = (ListView)findViewById(R.id.listavvisi);
               
                        CustomAdapter adapter = new CustomAdapter(this, R.layout.rowcustom, list);
                listView.setAdapter(adapter);
                                }

e il mio customadapter inizia così
Codice (Java): [Seleziona]
public class CustomAdapter extends ArrayAdapter<Avviso> {
    Context context;


          public CustomAdapter(Context context, int textViewResourceId, List<Avviso> Strings) {
                super(context, textViewResourceId, Strings);
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        return getViewOptimize(position, convertView, parent);
    }

Eclipse mi segnala errore nel settaggio del Context.. ho provato a cambiarlo in tutti i modi ma mi da sempre errore...cosa devo fare? grazie

Offline Ricky`

  • Amministratore
  • Utente storico
  • *****
  • Post: 3489
  • Respect: +506
    • Github
    • Google+
    • rciovati
    • Mostra profilo
Re:Listview Asynctask e customadapter
« Risposta #1 il: 04 Gennaio 2013, 13:19:07 CET »
+2
Quando instanzi l'adapter sei dentro la classe AsyncTask e quindi il this si riferisce appunto all'AsyncTask (che non estende Context).
Devi usare NomeActivity.this

Offline Kr1stian_17

  • Nuovo arrivato
  • *
  • Post: 14
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    XPERIA ARC S
Re:Listview Asynctask e customadapter
« Risposta #2 il: 04 Gennaio 2013, 22:55:24 CET »
0
grazie sono riuscito a procedere.... tutto funziona eccetto una cosa. Mi popola solo le prime 2 textview della Listview!!! non riesco a capacitarmi di cosa possa essere andato storto.. posto il codice sperando possiate aiutarmi
CustomAdapter.java
Codice (Java): [Seleziona]
public class CustomAdapter extends ArrayAdapter<Avviso> {
    Context context;

          public CustomAdapter(Context context, int textViewResourceId, List<Avviso> objects) {
                super(context, textViewResourceId, objects);
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        return getViewOptimize(position, convertView, parent);
    }

    public View getViewOptimize(int position, View convertView, ViewGroup parent) {
        ViewHolder viewHolder = null;
        if (convertView == null) {
            LayoutInflater inflater = (LayoutInflater) getContext()
                      .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            convertView = inflater.inflate(R.layout.rowcustom, null);
            viewHolder = new ViewHolder();
            viewHolder.testoavviso = (TextView)convertView.findViewById(R.id.textViewtitolo);
            convertView.setTag(viewHolder);
        } else {
            viewHolder = (ViewHolder) convertView.getTag();
        }
        Avviso avviso = getItem(position);
        viewHolder.testoavviso.setText(avviso.getTestoavviso());
        return convertView;
    }

    private class ViewHolder {
        public TextView testoavviso;
       
    }
}
Avvisi.java
Codice (Java): [Seleziona]
public class Avvisi extends Activity {
       // blog url
        static final String BLOG_URL =
                        "[url=http://www.miosito.com";][/url]
        ListView        listView;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        // set layout view
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_avvisi);
       
        try {
                 getlink task = new getlink();
             task.execute("Process started!");
             
             //la stringa verra passata al metodo doInBackground del nostro AsyncTask
             //per controllare lo stato del task, possiamo chiamare task.getStatus()
               
        }
        catch (Exception ex) {
                ((TextView)findViewById(R.id.avviso1)).setText("Error");
        }
    }
 
    private class getlink extends AsyncTask<String, String, List<Avviso>> {
        // I tre tipi da dichiarare sono relativamente (in questo caso usiamo solo stringhe)
        // il parametro in entrata di doInBackground  (quando chiamiamo execute passiamo una stringa)
        // il paramentro in entrata di onProgressUpdate (dati che vogliamo mostrare all' utente -opzionale,potremmo usare variabili globali-)
        // il parametro in entrata di onPostExecure (una volta finito il task, potremmo voler mostrare un risultato all'utente)
        // nel caso non volessimo usare parametri di alcun genere tipizziamo con Void,Void,Void (passeremo poi dei null come parametri)
        ListView listView = (ListView)findViewById(R.id.listavvisi);
        List<Avviso> avvisi = new LinkedList<Avviso>();
        @Override
        protected List<Avviso> doInBackground(String... arg) {
               
                // stringa passata a onProgressUpdate
             
                        String result = "";
                        Document doc = null;
                                        try {
                                                doc = Jsoup.connect(BLOG_URL).get();
                                        } catch (IOException e) {
                                                // TODO Auto-generated catch block
                                                e.printStackTrace();
                                        }
                                        Elements links = doc.select("td.AVVISI-FORMAT-DEFAULT > a[href]");
                                        int j=0;
                                        int numavvisi = links.size();
                        for (Element link : links) {
                                ;                                                              
                                                 if((j %2!=0) && (j<60))
                                                {
                                                         String testonews = link.text();
                                                         String urlavviso= link.attr("abs:href");
                                                int lunghezzanews = testonews.length();
                                                       
                                                if(lunghezzanews<80){
                                               
                                                avvisi.add(new Avviso(testonews));
                                                }
                                                                             
                                                else{
                                               
                                                avvisi.add(new Avviso(testonews.substring(0,80)));
                                                }
                                        }
                                                 else

                                                {                                                      
                                                }
                        j++;
                    }
                                               
                        return avvisi;
     
        }

     
                @Override
            protected void onProgressUpdate(final String... values){
                                                           
            }

        protected void onPostExecute(List<Avviso> avvisi) {
                CustomAdapter adapter = new CustomAdapter(Avvisi.this, R.layout.rowcustom, avvisi);
                listView.setAdapter(adapter);
        }

}
 
   
}      

Lo stesso codice adattato a sole textview funziona perfettamente...
« Ultima modifica: 04 Gennaio 2013, 23:03:09 CET da Kr1stian_17 »

Offline Kr1stian_17

  • Nuovo arrivato
  • *
  • Post: 14
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    XPERIA ARC S
Re:Listview Asynctask e customadapter
« Risposta #3 il: 05 Gennaio 2013, 11:23:32 CET »
0
nessuno ha un'idea?

Offline Kr1stian_17

  • Nuovo arrivato
  • *
  • Post: 14
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    XPERIA ARC S
Re:Listview Asynctask e customadapter
« Risposta #4 il: 05 Gennaio 2013, 13:07:25 CET »
0
ho risolto. c'era un errore dove definito il layout generale. Errore di battitura.