Autore Topic: [Android\ListView] Dati dinamici  (Letto 948 volte)

Offline ccmex

  • Nuovo arrivato
  • *
  • Post: 41
  • Respect: 0
    • Mostra profilo
[Android\ListView] Dati dinamici
« il: 11 Aprile 2014, 19:30:59 CEST »
0
Ciao a tutti.

Sto cercando di far popolare una ListView con dati dinamici in un'applicazione Android.

Non ho errori ma la ListView risulta essere vuota

Se provo, invece con dei dati statici tutto funziona alla grande.

La stringa di input dinamico è del tipo:

Codice: [Seleziona]
Titolo articolo<br />Autore
Ripetuta N volte per quanti ne estrae il DB, cioè:

Codice: [Seleziona]
Academic writing and publishing<br />Hartley, J.<br /><br />
A practical guidebook<br />Hays, J. C.<br /><br />
JEPS<br />Jamali, H. R.<br /><br />
...
...

Con questi dati statici la ListView funziona e si popola correttamente:

codice:
Codice: [Seleziona]
public static final String[] titles = new String[] { "Strawberry",
 "Banana", "Orange", "Mixed" };


 public static final String[] descriptions = new String[] {
 "It is an aggregate accessory fruit",
 "It is the largest herbaceous flowering plant", "Citrus Fruit",
 "Mixed Fruits" };


 public static final Integer[] images = { R.drawable.image1,
 R.drawable.image2, R.drawable.image3, R.drawable.image4 };

Con questi dati dinamici invece la ListView si presenta vuota, perchè?
Sapreste aiutarmi?
Grazie

Codice: [Seleziona]
try {

        httpTransport.call(SOAP_ACTION, envelope);
        SoapPrimitive response = (SoapPrimitive) envelope.getResponse();


        String myString = response.toString();   
        String myStringnew = myString.replaceAll("<br />", "\n");   
        String[] myStrings = myStringnew.split("\n");


        final String[] titles = new String[] { myStrings[0].toString() };
        final String[] descriptions = new String[] { myStrings[1].toString() };
        final Integer[] images = { R.drawable.image1, R.drawable.image2,
                R.drawable.image3, R.drawable.image4 };


        rowItems = new ArrayList<RowItem>();
        for (int i = 0; i < titles.length; i++) {
            RowItem item = new RowItem(images[i], titles[i],
                    descriptions[i]);
            rowItems.add(item);
        }


        listView = (ListView) findViewById(R.id.list);
        CustomListViewAdapter adapter = new CustomListViewAdapter(this,
                R.layout.list_item, rowItems);
        listView.setAdapter(adapter);
        listView.setOnItemClickListener(this);


    } catch (Exception exception) {
     
}

Offline GabMarioPower

  • Moderatore globale
  • Utente senior
  • *****
  • Post: 606
  • Respect: +152
    • Github
    • Google+
    • gabrielemariotti
    • GabMarioPower
    • Mostra profilo
  • Play Store ID:
    GAB+MARIO+DEV
  • Sistema operativo:
    Ubuntu 14.04 , Win 10
Re:[Android\ListView] Dati dinamici
« Risposta #1 il: 11 Aprile 2014, 21:59:28 CEST »
0
Se aggiungi, rimuovi o cambi dati sull'adapter, devi chiamare

Codice (Java): [Seleziona]
adapter.notifyDataSetChanged();

Offline Ricky`

  • Amministratore
  • Utente storico
  • *****
  • Post: 3489
  • Respect: +506
    • Github
    • Google+
    • rciovati
    • Mostra profilo
Re:[Android\ListView] Dati dinamici
« Risposta #2 il: 12 Aprile 2014, 10:26:39 CEST »
0
Hai provato a mettere un Log dell'eccezione nel blocco catch o utilizzare il debugger per capire cosa succede?
Secondo me si arrabbia perchè stai facendo una chiamata di rete nel main thread.

Se aggiungi, rimuovi o cambi dati sull'adapter, devi chiamare

Codice (Java): [Seleziona]
adapter.notifyDataSetChanged();

Quando chiami il metodo .add() l'adapter chiama automaticamente notifyDataSetChanged() ;)
« Ultima modifica: 12 Aprile 2014, 10:28:12 CEST da Ricky` »

Offline GabMarioPower

  • Moderatore globale
  • Utente senior
  • *****
  • Post: 606
  • Respect: +152
    • Github
    • Google+
    • gabrielemariotti
    • GabMarioPower
    • Mostra profilo
  • Play Store ID:
    GAB+MARIO+DEV
  • Sistema operativo:
    Ubuntu 14.04 , Win 10
Re:[Android\ListView] Dati dinamici
« Risposta #3 il: 12 Aprile 2014, 10:59:06 CEST »
0
Quando chiami il metodo .add() l'adapter chiama automaticamente notifyDataSetChanged() ;)

Vero.... se è un ArrayAdapter, cosa molto probabile in questo caso.

Offline ccmex

  • Nuovo arrivato
  • *
  • Post: 41
  • Respect: 0
    • Mostra profilo
Re:[Android\ListView] Dati dinamici
« Risposta #4 il: 12 Aprile 2014, 12:49:36 CEST »
0
Grazie per i preziosi suggerimenti.

Ho risolto usando il codice che posto alla fine di questa risposta.

Purtroppo però nella ListView l'output è il seguente:
Codice: [Seleziona]
https://www.LinkFromImageonTheGoogle.net/myImage.png
23/03/2014
<a href=http://www.mywebpage.net?ID=764>My remote pics</a>

https://www.LinkFromImageonTheGoogle.net/myImage1.png
22/03/2014
<a href=http://www.mywebpage.net?ID=765>My remote pics 1</a>

https://www.LinkFromImageonTheGoogle.net/myImage2.png
21/03/2014
<a href=http://www.mywebpage.net?ID=766>My remote pics 2</a>

Cioè non viene interpretato l'html contenuto nella stringa che arriva da remoto e quindi:
  • Non vedo l'immagine;
  • Non vedo il testo "My remote" pics con l'html applicato come collegamento ipertestuale.

Ho provato in questo modo, ma ho errore:
Codice: [Seleziona]
listAdapter.addAll(Html.fromHtml(xRemote.toString()));
The method addAll(Collection<? extends String>) in the type ArrayAdapter<String> is not applicable for the arguments (Spanned)

Come posso risolvere?
Grazie
Codice: [Seleziona]
public class news extends Activity {

        private static final String SOAP_ACTION = "[url=http://www.xxxxx.com/WebService/GetNews";]xxxxx.com: The Leading XXX Site on the Net[/url]
        private static final String OPERATION_NAME = "GetNews";
        private static final String WSDL_TARGET_NAMESPACE = "[url=http://www.xxxxx.com/GetNews";]xxxxx.com: The Leading XXX Site on the Net[/url]
        private static final String SOAP_ADDRESS = "[url=http://www.xxxxx.com/GetNews.asmx";]xxxxx.com: The Leading XXX Site on the Net[/url]

        private ListView mainListView;
        private ArrayAdapter<String> listAdapter;

        @SuppressLint("NewApi")
        @Override
        public void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                setContentView(R.layout.mains);

                mainListView = (ListView) findViewById(R.id.mainListView);

                StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder()
                                .permitAll().build();
                StrictMode.setThreadPolicy(policy);

                SoapObject request = new SoapObject(WSDL_TARGET_NAMESPACE,
                                OPERATION_NAME);

                SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(
                                SoapEnvelope.VER11);

                envelope.dotNet = true;
                envelope.implicitTypes = false;
                envelope.setOutputSoapObject(request);

                HttpTransportSE httpTransport = new HttpTransportSE(SOAP_ADDRESS);
                httpTransport.debug = true;
                envelope.setOutputSoapObject(request);

                try {

                        httpTransport.call(SOAP_ACTION, envelope);
                        SoapPrimitive response = (SoapPrimitive) envelope.getResponse();

                        String remote = response.toString();
                        Log.i("remote", remote.toString());

                        String xRemote = remote.replaceAll("<br />", "\n");
                        Log.i("xRemote", xRemote);

                        String[] xxRemote = xRemote.split("\n");
                        Log.i("xxRemote0", xxRemote[0].toString());
                        Log.i("xxRemote1", xxRemote[1].toString());
                        Log.i("xxRemote2", xxRemote[2].toString());

                        ArrayList<String> planetList = new ArrayList<String>();
                        planetList.addAll(Arrays.asList(xRemote));

                        listAdapter = new ArrayAdapter<String>(this, R.layout.simplerow,
                                        R.id.rowTextView, planetList);

                        listAdapter.addAll(xRemote.toString());

                        mainListView.setAdapter(listAdapter);

                } catch (Exception exception) {

                }
        }
}
« Ultima modifica: 12 Aprile 2014, 12:52:32 CEST da ccmex »

Offline Ricky`

  • Amministratore
  • Utente storico
  • *****
  • Post: 3489
  • Respect: +506
    • Github
    • Google+
    • rciovati
    • Mostra profilo
Re:[Android\ListView] Dati dinamici
« Risposta #5 il: 12 Aprile 2014, 13:26:21 CEST »
0
Codice (Java): [Seleziona]
                StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder()
                                .permitAll().build();
                StrictMode.setThreadPolicy(policy);

Dovrebbero vietarlo per legge questo codice!

Keeping Your App Responsive | Android Developers

Offline ccmex

  • Nuovo arrivato
  • *
  • Post: 41
  • Respect: 0
    • Mostra profilo
Re:[Android\ListView] Dati dinamici
« Risposta #6 il: 12 Aprile 2014, 13:31:24 CEST »
0
Codice (Java): [Seleziona]
                StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder()
                                .permitAll().build();
                StrictMode.setThreadPolicy(policy);

Dovrebbero vietarlo per legge questo codice!

Keeping Your App Responsive | Android Developers
Perchè? Puoi spiegarlo? Grazie

Offline Ricky`

  • Amministratore
  • Utente storico
  • *****
  • Post: 3489
  • Respect: +506
    • Github
    • Google+
    • rciovati
    • Mostra profilo
Re:[Android\ListView] Dati dinamici
« Risposta #7 il: 12 Aprile 2014, 14:20:24 CEST »
0
Perchè dici al sistema di non arrabbiarsi se blocchi il main thread.
Le motivazioni per cui questo non dovrebbe essere mai fatto, ma sopratutto quando si fanno operazioni di rete, è spiegato ne link sopra.

Offline ccmex

  • Nuovo arrivato
  • *
  • Post: 41
  • Respect: 0
    • Mostra profilo
Re:[Android\ListView] Dati dinamici
« Risposta #8 il: 12 Aprile 2014, 15:08:35 CEST »
0
Perchè dici al sistema di non arrabbiarsi se blocchi il main thread.
Le motivazioni per cui questo non dovrebbe essere mai fatto, ma sopratutto quando si fanno operazioni di rete, è spiegato ne link sopra.
Bene, grazie ho corretto secondo le indicazioni del link.

Rimangono però i problemi segnalati nella risposta numero 5 ...
« Ultima modifica: 12 Aprile 2014, 15:10:15 CEST da ccmex »

Offline GabMarioPower

  • Moderatore globale
  • Utente senior
  • *****
  • Post: 606
  • Respect: +152
    • Github
    • Google+
    • gabrielemariotti
    • GabMarioPower
    • Mostra profilo
  • Play Store ID:
    GAB+MARIO+DEV
  • Sistema operativo:
    Ubuntu 14.04 , Win 10
Re:[Android\ListView] Dati dinamici
« Risposta #9 il: 12 Aprile 2014, 15:21:26 CEST »
0
Perchè? Puoi spiegarlo? Grazie

Perchè è come se dicessi ad una bicicletta di correre anche se le gomme sono bloccate.

Tra le altre cose, come indicato anche sopra, non fare blocchi try-catch senza fare almeno un log dentro.
Perchè in questo modo non ti accorgi nemmeno che sei andato in catch.

Offline ccmex

  • Nuovo arrivato
  • *
  • Post: 41
  • Respect: 0
    • Mostra profilo
Re:[Android\ListView] Dati dinamici
« Risposta #10 il: 12 Aprile 2014, 15:28:48 CEST »
0
Perchè è come se dicessi ad una bicicletta di correre anche se le gomme sono bloccate.

Tra le altre cose, come indicato anche sopra, non fare blocchi try-catch senza fare almeno un log dentro.
Perchè in questo modo non ti accorgi nemmeno che sei andato in catch.
Bene, grazie anche qui ho corretto:
Codice: [Seleziona]
                try {
                                ....
                                ....
                             
                              } catch (Exception exception) {
                                    Log.i("Errore:  ", exception.toString());
                              }

Offline GabMarioPower

  • Moderatore globale
  • Utente senior
  • *****
  • Post: 606
  • Respect: +152
    • Github
    • Google+
    • gabrielemariotti
    • GabMarioPower
    • Mostra profilo
  • Play Store ID:
    GAB+MARIO+DEV
  • Sistema operativo:
    Ubuntu 14.04 , Win 10
Re:[Android\ListView] Dati dinamici
« Risposta #11 il: 12 Aprile 2014, 19:05:20 CEST »
0
Codice: [Seleziona]
                try {
                             
                              } catch (Exception exception) {
                                    Log.i("Errore:  ", exception.toString());
                              }
Magari meglio un Log.e

Offline ccmex

  • Nuovo arrivato
  • *
  • Post: 41
  • Respect: 0
    • Mostra profilo
Re:[Android\ListView] Dati dinamici
« Risposta #12 il: 13 Aprile 2014, 14:23:17 CEST »
0
Magari meglio un Log.e
Bene, grazie anche qui ho corretto.

Posto l'ultima versione del codice.

In questa versione riesco a popolare la ListView ma non riesco a formattarla per l'HTML.

Nel LogCat gli output sono corretti:
Codice: [Seleziona]
04-13 11:10:46.443: I/RemoteStringnew(9941): https://www.LinkFromImageonTheGoogle.net/myImage.png
04-13 11:10:46.443: I/RemoteStringnew(9941): 23/03/2014
04-13 11:10:46.443: I/RemoteStringnew(9941): <a href=http://www.mywebpage.net?ID=768>Foto 5</a>


04-13 11:10:46.443: I/RemoteStringnew(9941): https://www.LinkFromImageonTheGoogle.net/myImage1.png
04-13 11:10:46.443: I/RemoteStringnew(9941): 09/03/2014
04-13 11:10:46.443: I/RemoteStringnew(9941): <a href=http://www.mywebpage.net?ID=767>Foto 4</a>


04-13 11:10:46.443: I/RemoteStringnew(9941): https://www.LinkFromImageonTheGoogle.net/myImage2.png
04-13 11:10:46.443: I/RemoteStringnew(9941): 25/02/2014
04-13 11:10:46.443: I/RemoteStringnew(9941): <a href=http://www.mywebpage.net?ID=766>Foto 3</a>


04-13 11:10:46.443: I/RemoteStringnew(9941): https://www.LinkFromImageonTheGoogle.net/myImage3.png
04-13 11:10:46.443: I/RemoteStringnew(9941): 16/02/2014
04-13 11:10:46.443: I/RemoteStringnew(9941): <a href=http://www.mywebpage.net?ID=765>Foto 2</a>


04-13 11:10:46.443: I/RemoteStringnew(9941): https://www.LinkFromImageonTheGoogle.net/myImage4.png
04-13 11:10:46.443: I/RemoteStringnew(9941): 13/02/2014
04-13 11:10:46.443: I/RemoteStringnew(9941): <a href=http://www.mywebpage.net?ID=764>Foto 1</a>

Invece di avere in uscita:
Codice: [Seleziona]
https://www.LinkFromImageonTheGoogle.net/myImage.png ( Non si vede l'img, ma il link all'img)
23/03/2014
Foto 5 (con il link attivo su http://www.mywebpage.net?ID=768)


https://www.LinkFromImageonTheGoogle.net/myImage1.png ( Non si vede l'img, ma il link all'img )
22/03/2014
Foto 4 (con il link attivo su http://www.mywebpage.net?ID=767)


https://www.LinkFromImageonTheGoogle.net/myImage2.png ( Non si vede l'img, ma il link all'img )
21/03/2014
Foto 3 (con il link attivo su http://www.mywebpage.net?ID=766)


https://www.LinkFromImageonTheGoogle.net/myImage2.png ( Non si vede l'img, ma il link all'img )
21/03/2014
Foto 2 (con il link attivo su http://www.mywebpage.net?ID=765)


https://www.LinkFromImageonTheGoogle.net/myImage2.png ( Non si vede l'img, ma il link all'img )
21/03/2014
Foto 1 (con il link attivo su http://www.mywebpage.net?ID=764)

Ho questo output:
Codice: [Seleziona]
https://www.LinkFromImageonTheGoogle.net/myImage.png
23/03/2014
<a href=http://www.mywebpage.net?ID=768>Foto 5</a>


https://www.LinkFromImageonTheGoogle.net/myImage1.png
09/03/2014
<a href=http://www.mywebpage.net?ID=767>Foto 4</a>


https://www.LinkFromImageonTheGoogle.net/myImage2.png
25/02/2014
<a href=http://www.mywebpage.net?ID=766>Foto 3</a>


https://www.LinkFromImageonTheGoogle.net/myImage3.png
16/02/2014
<a href=http://www.mywebpage.net?ID=765>Foto 2</a>


https://www.LinkFromImageonTheGoogle.net/myImage4.png
13/02/2014
<a href=http://www.mywebpage.net?ID=764>Foto 1</a>

Questa è la classe java:
Codice: [Seleziona]
public class news extends Activity {

    private static final String SOAP_ACTION = "[url=http://www.xxxxx.com/WebService/GetNews";]xxxxx.com: The Leading XXX Site on the Net[/url]
    private static final String OPERATION_NAME = "GetNews";
    private static final String WSDL_TARGET_NAMESPACE = "[url=http://www.xxxxx.com/GetNews";]xxxxx.com: The Leading XXX Site on the Net[/url]
    private static final String SOAP_ADDRESS = "[url=http://www.xxxxx.com/GetNews.asmx";]xxxxx.com: The Leading XXX Site on the Net[/url]


        private ListView mainListView;
        private ArrayAdapter<String> listAdapter;

        @Override
        public void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                setContentView(R.layout.mains);

                mainListView = (ListView) findViewById(R.id.mainListView);

                SoapObject request = new SoapObject(WSDL_TARGET_NAMESPACE,
                                OPERATION_NAME);

                SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(
                                SoapEnvelope.VER11);

                envelope.dotNet = true;
                envelope.implicitTypes = false;
                envelope.setOutputSoapObject(request);

                HttpTransportSE httpTransport = new HttpTransportSE(SOAP_ADDRESS);
                httpTransport.debug = true;
                envelope.setOutputSoapObject(request);

                try {

                        httpTransport.call(SOAP_ACTION, envelope);
                        SoapPrimitive response = (SoapPrimitive) envelope.getResponse();

                        String ws = response.toString();
                        Log.i("wsString", ws.toString());

                        String wsnew = ws.replaceAll("<br />", "\n");
                        Log.i("RemoteStringnew", wsnew);

                        String[] wss = wsnew.split("\n");

                        Spanned spanned = Html.fromHtml(wss.toString());

                        Object[] strings = spanned.getSpans(0, ws.length(), Object.class);

                        List<String> urls = new ArrayList<String>();
                        for (Object obj : strings) {
                                if (obj instanceof URLSpan) {
                                        URLSpan urlSpan = (URLSpan) obj;

                                        urls.add(urlSpan.getURL());
                                }
                        }

                        ArrayList<String> planetList = new ArrayList<String>();
                        planetList.addAll(Arrays.asList(wss));

                        listAdapter = new ArrayAdapter<String>(this, R.layout.simplerow,
                                        R.id.rowTextView, planetList);

                        listAdapter.addAll(urls);

                        mainListView.setAdapter(listAdapter);

                } catch (Exception exception) {
                      Log.e("Error:  ", exception.toString());
                }
        }
}

mains.xml
Codice: [Seleziona]
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  android:orientation="vertical"
  android:layout_width="fill_parent"
  android:layout_height="fill_parent">

    <ListView android:layout_width="fill_parent"
      android:layout_height="fill_parent"
      android:id="@+id/mainListView">
    </ListView>

</LinearLayout>


simplerow.xml
Codice: [Seleziona]
<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
 android:id="@+id/rowTextView"
 android:layout_width="fill_parent"
 android:layout_height="wrap_content"
 android:padding="10dp"
 android:textSize="16sp" >
</TextView>
« Ultima modifica: 13 Aprile 2014, 14:29:44 CEST da ccmex »