Autore Topic: ListView e Picasso...  (Letto 155 volte)

Offline marcolino461

  • Nuovo arrivato
  • *
  • Post: 6
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Huawey EVA-L09
  • Sistema operativo:
    Windows 10
ListView e Picasso...
« il: 07 Dicembre 2017, 16:45:36 CET »
0
Salve a tutti, ho trovato la soluzione al mio problema giorni fa su questo forum e ora ci riprovo.
Con Android Studio ho aperto contemporaneamente due progetti:
Sono 2 app quasi identiche (Una deriva dall'altra) con alcune differenze.
Tutte e due comunque visualizzano dati provenienti da server MySQL remoto tramite JSON ListView ListView Adapter.
Il listview in questione visualizza testo con una semplice piccola immagine a fianco.
Ecco il tipico esempio di list view adapter:
Codice (Java): [Seleziona]
public class CustomListView extends ArrayAdapter<Category> {
   

    public CustomListView(Activity context, ArrayList<Category> categories) {
        super(context, 0,categories);

    }
    @NonNull
    @Override
    public  View getView(int position, View convertView, ViewGroup parent){
        // Get the data item for this position
        ViewHolder holder;

        Category category = getItem(position);
        // Check if an existing view is being reused, otherwise inflate the view

        if(convertView == null){
            convertView = LayoutInflater.from(getContext()).inflate(R.layout.listview_layout, parent, false);
        }
        // Lookup view for data population
        TextView tvID = (TextView) convertView.findViewById(R.id.textViewDesc);
        TextView tvCategory = (TextView) convertView.findViewById(R.id.tvCategory);
        ImageView imageView = (ImageView) convertView.findViewById((R.id.imageView)) ;
        Picasso.with(getContext()).load(category.imageLink).into(imageView);
        TextView tvAggiunto = (TextView) convertView.findViewById(R.id.textView3);
        tvAggiunto.setText(category.imageLink);
        // Populate the data into the template view using the data object
        tvID.setText(category.IdCategory);
        tvCategory.setText(category.description);


        return  convertView;
    }

    static class ViewHolder {
        TextView headlineView;
        TextView reporterNameView;
        TextView reportedDateView;
        ImageView imageView;
    }

Nella seconda app (che sarebbe la versione 2) l'immagine non viene visualizzata
Nella prima invece tutto corretto.
Sia i layout sia gli adapter sono identici in quanto frutto di un copia/incolla.
La fonte dati è la medesima.
Insomma...tutto uguale tranne il risultato :-o

Se a qualcuno venisse in mente qualcosa...

Gli strumenti:

Codice (Java): [Seleziona]
compile 'com.squareup.picasso:picasso:2.5.2'
android {
    compileSdkVersion 26
    defaultConfig {
        applicationId "ch.pastificionegri.pastificio"
        minSdkVersion 19
        targetSdkVersion 26
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    }



Offline iClaude

  • Utente normale
  • ***
  • Post: 299
  • Respect: +24
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy S8
  • Sistema operativo:
    Windows 10
Re:ListView e Picasso...
« Risposta #1 il: 07 Dicembre 2017, 17:55:21 CET »
0
Ma il codice che hai postato è quello che funziona o non funziona?
Cmq prova a fare queste modifiche:
a) nel costruttore dell'adapter quando richiami il costruttore della superclasse con super passa anche l'id del layout di ogni elemento della ListView (perchè hai passato 0?)
b) salva il context passato nel costruttore come variabile interna e utilizza questa quando hai bisogno di un Context
c) eventualmente abilita il logging per vedere se ci sono msg di errore:
Picasso 
    .with(context)
    .setLoggingEnabled(true);

Offline marcolino461

  • Nuovo arrivato
  • *
  • Post: 6
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Huawey EVA-L09
  • Sistema operativo:
    Windows 10
Re:ListView e Picasso...
« Risposta #2 il: 07 Dicembre 2017, 18:14:52 CET »
0
Ciao, quello che ho postato è quello che non funziona, ma credimi, è perfettamente identico a quello che funziona salvo alcune differenze.
La TextView aggiunta all'adapter col nome di tvAggiunto visualizza la corretta URL dell'immagine (tanto per vedere cosa gli passo a Picasso).
Per quello che riguarda lo zero beh, non so. E' uno scritto copia/incolla che ho trovato da qualche parte. Nella vecchia app non mi ha mai dato problemi Picasso.
Provero' a fare quello che mi dici

Post unito: [time]07 Dicembre 2017, 18:16:31 CET[/time]
.....comunque grazie per le info. Ho girovagato un po' sul web ma nessuna risposta alla mia domanda :-)

Post unito: 07 Dicembre 2017, 18:35:11 CET
Questo codice per esempio funziona perfettamente (è il primo)

Codice (Java): [Seleziona]
public class CustomListView extends ArrayAdapter<Category> {


    public CustomListView(Activity context, ArrayList<Category> categories) {
        super(context, 0,categories);

    }
   @NonNull
    @Override
    public  View getView(int position, View convertView, ViewGroup parent){
       // Get the data item for this position
       ViewHolder holder;

       Category category = getItem(position);
       // Check if an existing view is being reused, otherwise inflate the view

       if(convertView == null){
           convertView = LayoutInflater.from(getContext()).inflate(R.layout.listview_layout, parent, false);
       }
        // Lookup view for data population
       TextView tvID = (TextView) convertView.findViewById(R.id.textViewDesc);
       TextView tvCategory = (TextView) convertView.findViewById(R.id.tvCategory);

       ImageView imageView = (ImageView) convertView.findViewById((R.id.imageView)) ;

       // Populate the data into the template view using the data object
       tvID.setText(category.IDCategory);
       tvCategory.setText(category.description);

       Picasso.with(getContext()).load(category.imageLink).into(imageView);

    //   ivCategory.setImageResource(0);          -------------    ??????
       // Return the completed view to render on screen

       return  convertView;
   }

    static class ViewHolder {
        TextView headlineView;
        TextView reporterNameView;
        TextView reportedDateView;
        ImageView imageView;
    }

e questo è il log di picasso nell'app che non funziona
Codice (Java): [Seleziona]
D/Picasso: Main        created      [R2] Request{http://www.marconegri.altervista.org/images/img1_1.png}
D/Picasso: Dispatcher  enqueued     [R2]+1ms
D/Picasso: Hunter      executing    [R2]+2ms
D/Picasso: Main        created      [R3] Request{http://www.marconegri.altervista.org/images/img2_1.png}
D/Picasso: Dispatcher  enqueued     [R3]+0ms
D/Picasso: Hunter      executing    [R3]+4ms
D/Picasso: Hunter      decoded      [R2]+36ms
D/Picasso: Dispatcher  batched      [R2]+37ms for completion
D/Picasso: Main        created      [R4] Request{http://www.marconegri.altervista.org/images/button_1.png}
D/Picasso: Hunter      executing    [R4]+10ms
D/Picasso: Hunter      decoded      [R3]+46ms
D/Picasso: Dispatcher  enqueued     [R4]+9ms
D/Picasso: Dispatcher  batched      [R3]+46ms for completion
D/Picasso: Hunter      decoded      [R4]+24ms
D/Picasso: Dispatcher  batched      [R4]+24ms for completion
D/Picasso: Dispatcher  delivered    [R2]+244ms, [R3]+235ms, [R4]+200ms
D/Picasso: Main        completed    [R2]+303ms from DISK
D/Picasso: Main        completed    [R3]+294ms from DISK
D/Picasso: Main        completed    [R4]+260ms from DISK

Ti dice qualcosa ?
« Ultima modifica: 07 Dicembre 2017, 18:35:11 CET da marcolino461, Reason: Merged DoublePost »

Offline iClaude

  • Utente normale
  • ***
  • Post: 299
  • Respect: +24
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy S8
  • Sistema operativo:
    Windows 10
Re:ListView e Picasso...
« Risposta #3 il: 07 Dicembre 2017, 18:44:09 CET »
0
Cmq per prima cosa ti conviene sistemare l'adapter perché a occhio non hai implementato correttamente il pattern ViewHolder.
Segui questa risposta (la prima risposta accettata):
https://stackoverflow.com/questions/3832254/how-can-i-make-my-arrayadapter-follow-the-viewholder-pattern

Offline marcolino461

  • Nuovo arrivato
  • *
  • Post: 6
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Huawey EVA-L09
  • Sistema operativo:
    Windows 10
Re:ListView e Picasso...
« Risposta #4 il: 07 Dicembre 2017, 20:10:11 CET »
0
Ciao.  RISOLTO. Da non credere. Non mi sono accorto di avere un ImageView nascosta con un ID uguale, Picasso faceva solo confusione.
Grazie a tutti comunque

Offline iClaude

  • Utente normale
  • ***
  • Post: 299
  • Respect: +24
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy S8
  • Sistema operativo:
    Windows 10
Re:ListView e Picasso...
« Risposta #5 il: 07 Dicembre 2017, 20:26:14 CET »
0
Ciao.  RISOLTO. Da non credere. Non mi sono accorto di avere un ImageView nascosta con un ID uguale, Picasso faceva solo confusione.
Grazie a tutti comunque

Ok, però ti consiglio ugualmente di sistemare l'adapter perché non stai utilizzando il pattern ViewHolder e questo, specialmente se la lista è lunga, è poco efficiente. O meglio ancora usare una RecyclerView che ormai è lo standard.

Offline marcolino461

  • Nuovo arrivato
  • *
  • Post: 6
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Huawey EVA-L09
  • Sistema operativo:
    Windows 10
Re:ListView e Picasso...
« Risposta #6 il: 08 Dicembre 2017, 15:48:13 CET »
0
Ciao. Ho cominciato a settembre con AndroidStudio e Java, non conosco bene ancora ne l'ambiente, ne gli oggetti ne tantomeno la filosofia di questo IDE.
Cosa intendi con sistemare l' Adapter ,  non stai utilizzando il pattern ViewHolder ...... Recycler View ...., che roba è, come funziona, a cosa serve ?
Se puoi farmi un piccolo esempio sulla base di quanto io ho postato capirei meglio.. ;-)

Offline iClaude

  • Utente normale
  • ***
  • Post: 299
  • Respect: +24
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy S8
  • Sistema operativo:
    Windows 10
Re:ListView e Picasso...
« Risposta #7 il: Ieri alle 10:58 »
0
Ciao. Ho cominciato a settembre con AndroidStudio e Java, non conosco bene ancora ne l'ambiente, ne gli oggetti ne tantomeno la filosofia di questo IDE.
Cosa intendi con sistemare l' Adapter ,  non stai utilizzando il pattern ViewHolder ...... Recycler View ...., che roba è, come funziona, a cosa serve ?
Se puoi farmi un piccolo esempio sulla base di quanto io ho postato capirei meglio.. ;-)

Se guardi la risposta di StackOverflow che ho linkato sopra vedrai che nel tuo codice non hai applicato il pattern ViewHolder. Serve per migliorare le prestazioni delle ListView.