Autore Topic: ListView personalizzata  (Letto 888 volte)

Offline Klizard

  • Utente junior
  • **
  • Post: 62
  • Respect: 0
    • Mostra profilo
ListView personalizzata
« il: 14 Novembre 2015, 17:53:41 CET »
0
Ciao a tutti, apro questo 3d perché sto incontrando qualche difficoltà nella creazione di una listView personalizzata.

Il codice è il seguente:

1) Ho creato la classe Evento:
Codice (Java): [Seleziona]
public class Evento { //Classe di ogni elemento della riga
    String id;
    String image;
    String nome;

    public Evento(String id,String image,String nome){
        super();
        this.id = id;
        this.image = image;
        this.nome = nome;
    }

    public String getId(){
        return id;
    }
    public String getImage(){
        return image;
    }
    public String getNome(){
        return nome;
    }
    public void setId(String id){
        this.id = id;
    }
    public void setImage(String image){
        this.image = image;
    }
    public void setNome(String nome){
        this.nome = nome;
    }
}

2) Ho creato un file xml che rappresenta la riga della lista (Evito di incollarlo visto che sono semplicemente 2 TextView e un'ImageView)

3) Ho creato l'adapter presonalizzato (qui dentro ho sicuramente qualche errore che mi blocca. Per caricare le immagini uso l'universal image Loader ma il problema non è dato da lui visto che anche mettendo un'immagine di default il problema persiste):
Codice (Java): [Seleziona]
public class MyAdapter extends BaseAdapter {
    private Activity activity;
    private ArrayList listaEv;
    private static LayoutInflater inflater = null;
    public ImageLoader imageLoader;

    public MyAdapter(Activity activity,ArrayList<Evento> listaEventi){
        this.activity = activity;
        this.listaEv = listaEventi;
        inflater = (LayoutInflater) activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    }

    @Override
    public int getCount() {
        return listaEv.size();
    }

    @Override
    public Object getItem(int position) {
        return position;
    }

    @Override
    public long getItemId(int position) {
        return position;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        View vi = convertView;
        if(convertView == null)
            vi = inflater.inflate(R.layout.custom_layout,null);

        TextView id = (TextView) vi.findViewById(R.id.id);
        ImageView immagine = (ImageView) vi.findViewById(R.id.immagine);
        TextView nome = (TextView) vi.findViewById(R.id.nome);

        Evento eventoCorrente = (Evento)listaEv.get(position);

        ImageLoader imageLoader = ImageLoader.getInstance();
        DisplayImageOptions options = new DisplayImageOptions.Builder()
                .cacheInMemory(true)
                .cacheOnDisc(true)
                .resetViewBeforeLoading(true)
                .showImageForEmptyUri(R.drawable.empty_gallery)
                .showImageOnFail(R.drawable.error)
                .showImageOnLoading(R.drawable.loading).build();
        imageLoader.displayImage(eventoCorrente.getImage(), immagine, options);


        id.setText(eventoCorrente.getId());
        nome.setText(eventoCorrente.getNome());
        return null;
    }
}

4) Preciso che ho un ArrayList pubblico che creo al momento di fare il parsing (prelevo i dati da un JSON, in un'altra classe)
Codice (Java): [Seleziona]
public static ArrayList<Evento> listaEventi = new ArrayList<Evento>();
[...]
for(int i=0; i<jsonArray.length();i++){
            listaEventi.add(new Evento(jsonArray.getJSONObject(i).getString("id"),jsonArray.getJSONObject(i).getString("image"),jsonArray.getJSONObject(i).getString("nome")));
        }
4) Infine, collego listView ad adapter nella classe principale mediante:
Codice (Java): [Seleziona]
MyAdapter myAdapter = new MyAdapter(MainActivity.this,jsonParser.listaEventi);
                listView.setAdapter(myAdapter);


Sapreste dirmi dove sbaglio?
Grazie in anticipo a chiunque voglia aiutarmi :)

Offline pietroconti89

  • Utente normale
  • ***
  • Post: 164
  • Respect: +19
    • Mostra profilo
  • Dispositivo Android:
    Galaxy Note 3 N9005
  • Sistema operativo:
    Windows / Mac OSX
Re:ListView personalizzata
« Risposta #1 il: 14 Novembre 2015, 18:37:10 CET »
0
ma il problema che ti si presenta qual'è ?  :-P

Offline Klizard

  • Utente junior
  • **
  • Post: 62
  • Respect: 0
    • Mostra profilo
Re:ListView personalizzata
« Risposta #2 il: 14 Novembre 2015, 19:02:55 CET »
0
Ah già ho dimenticato la cosa più importante..questo è il log:
Codice (Java): [Seleziona]
11-14 18:59:56.619 3519-3519/com.example.user.parser_json_002 W/dalvikvm: threadid=1: thread exiting with uncaught exception (group=0x41b8b730)
11-14 18:59:56.824 3519-3519/com.example.user.parser_json_002 E/AndroidRuntime: FATAL EXCEPTION: main
11-14 18:59:56.824 3519-3519/com.example.user.parser_json_002 E/AndroidRuntime: java.lang.NullPointerException
11-14 18:59:56.824 3519-3519/com.example.user.parser_json_002 E/AndroidRuntime:     at android.widget.ListView.measureScrapChild(ListView.java:1179)
11-14 18:59:56.824 3519-3519/com.example.user.parser_json_002 E/AndroidRuntime:     at android.widget.ListView.measureHeightOfChildren(ListView.java:1261)
11-14 18:59:56.824 3519-3519/com.example.user.parser_json_002 E/AndroidRuntime:     at android.widget.ListView.onMeasure(ListView.java:1171)
11-14 18:59:56.824 3519-3519/com.example.user.parser_json_002 E/AndroidRuntime:     at android.view.View.measure(View.java:16831)
11-14 18:59:56.824 3519-3519/com.example.user.parser_json_002 E/AndroidRuntime:     at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5245)
11-14 18:59:56.824 3519-3519/com.example.user.parser_json_002 E/AndroidRuntime:     at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1410)
11-14 18:59:56.824 3519-3519/com.example.user.parser_json_002 E/AndroidRuntime:     at android.widget.LinearLayout.measureVertical(LinearLayout.java:695)
11-14 18:59:56.824 3519-3519/com.example.user.parser_json_002 E/AndroidRuntime:     at android.widget.LinearLayout.onMeasure(LinearLayout.java:588)
11-14 18:59:56.824 3519-3519/com.example.user.parser_json_002 E/AndroidRuntime:     at android.view.View.measure(View.java:16831)
11-14 18:59:56.824 3519-3519/com.example.user.parser_json_002 E/AndroidRuntime:     at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5245)
11-14 18:59:56.824 3519-3519/com.example.user.parser_json_002 E/AndroidRuntime:     at android.widget.FrameLayout.onMeasure(FrameLayout.java:310)
11-14 18:59:56.824 3519-3519/com.example.user.parser_json_002 E/AndroidRuntime:     at android.support.v7.internal.widget.ContentFrameLayout.onMeasure(ContentFrameLayout.java:124)
11-14 18:59:56.824 3519-3519/com.example.user.parser_json_002 E/AndroidRuntime:     at android.view.View.measure(View.java:16831)
11-14 18:59:56.824 3519-3519/com.example.user.parser_json_002 E/AndroidRuntime:     at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5245)
11-14 18:59:56.824 3519-3519/com.example.user.parser_json_002 E/AndroidRuntime:     at android.support.v7.internal.widget.ActionBarOverlayLayout.onMeasure(ActionBarOverlayLayout.java:393)
11-14 18:59:56.824 3519-3519/com.example.user.parser_json_002 E/AndroidRuntime:     at android.view.View.measure(View.java:16831)
11-14 18:59:56.824 3519-3519/com.example.user.parser_json_002 E/AndroidRuntime:     at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5245)
11-14 18:59:56.824 3519-3519/com.example.user.parser_json_002 E/AndroidRuntime:     at android.widget.FrameLayout.onMeasure(FrameLayout.java:310)
11-14 18:59:56.824 3519-3519/com.example.user.parser_json_002 E/AndroidRuntime:     at android.view.View.measure(View.java:16831)
11-14 18:59:56.824 3519-3519/com.example.user.parser_json_002 E/AndroidRuntime:     at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5245)
11-14 18:59:56.824 3519-3519/com.example.user.parser_json_002 E/AndroidRuntime:     at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1410)
11-14 18:59:56.824 3519-3519/com.example.user.parser_json_002 E/AndroidRuntime:     at android.widget.LinearLayout.measureVertical(LinearLayout.java:695)
11-14 18:59:56.824 3519-3519/com.example.user.parser_json_002 E/AndroidRuntime:     at android.widget.LinearLayout.onMeasure(LinearLayout.java:588)
11-14 18:59:56.824 3519-3519/com.example.user.parser_json_002 E/AndroidRuntime:     at android.view.View.measure(View.java:16831)
11-14 18:59:56.824 3519-3519/com.example.user.parser_json_002 E/AndroidRuntime:     at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5245)
11-14 18:59:56.824 3519-3519/com.example.user.parser_json_002 E/AndroidRuntime:     at android.widget.FrameLayout.onMeasure(FrameLayout.java:310)
11-14 18:59:56.824 3519-3519/com.example.user.parser_json_002 E/AndroidRuntime:     at com.android.internal.policy.impl.PhoneWindow$DecorView.onMeasure(PhoneWindow.java:2586)
11-14 18:59:56.824 3519-3519/com.example.user.parser_json_002 E/AndroidRuntime:     at android.view.View.measure(View.java:16831)
11-14 18:59:56.824 3519-3519/com.example.user.parser_json_002 E/AndroidRuntime:     at android.view.ViewRootImpl.performMeasure(ViewRootImpl.java:2189)
11-14 18:59:56.824 3519-3519/com.example.user.parser_json_002 E/AndroidRuntime:     at android.view.ViewRootImpl.measureHierarchy(ViewRootImpl.java:1352)
11-14 18:59:56.824 3519-3519/com.example.user.parser_json_002 E/AndroidRuntime:     at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1535)
11-14 18:59:56.824 3519-3519/com.example.user.parser_json_002 E/AndroidRuntime:     at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1249)
11-14 18:59:56.824 3519-3519/com.example.user.parser_json_002 E/AndroidRuntime:     at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:6364)
11-14 18:59:56.824 3519-3519/com.example.user.parser_json_002 E/AndroidRuntime:     at android.view.Choreographer$CallbackRecord.run(Choreographer.java:791)
11-14 18:59:56.824 3519-3519/com.example.user.parser_json_002 E/AndroidRuntime:     at android.view.Choreographer.doCallbacks(Choreographer.java:591)
11-14 18:59:56.824 3519-3519/com.example.user.parser_json_002 E/AndroidRuntime:     at android.view.Choreographer.doFrame(Choreographer.java:561)
11-14 18:59:56.824 3519-3519/com.example.user.parser_json_002 E/AndroidRuntime:     at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:777)
11-14 18:59:56.824 3519-3519/com.example.user.parser_json_002 E/AndroidRuntime:     at android.os.Handler.handleCallback(Handler.java:730)
11-14 18:59:56.824 3519-3519/com.example.user.parser_json_002 E/AndroidRuntime:     at android.os.Handler.dispatchMessage(Handler.java:92)
11-14 18:59:56.824 3519-3519/com.example.user.parser_json_002 E/AndroidRuntime:     at android.os.Looper.loop(Looper.java:176)
11-14 18:59:56.824 3519-3519/com.example.user.parser_json_002 E/AndroidRuntime:     at android.app.ActivityThread.main(ActivityThread.java:5419)
11-14 18:59:56.824 3519-3519/com.example.user.parser_json_002 E/AndroidRuntime:     at java.lang.reflect.Method.invokeNative(Native Method)
11-14 18:59:56.824 3519-3519/com.example.user.parser_json_002 E/AndroidRuntime:     at java.lang.reflect.Method.invoke(Method.java:525)
11-14 18:59:56.824 3519-3519/com.example.user.parser_json_002 E/AndroidRuntime:     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1046)
11-14 18:59:56.824 3519-3519/com.example.user.parser_json_002 E/AndroidRuntime:     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:862)
11-14 18:59:56.824 3519-3519/com.example.user.parser_json_002 E/AndroidRuntime:     at dalvik.system.NativeStart.main(Native Method)
Sicuramente è un problema dell'adapter però vorrei capire anche se faccio bene il parsing. Riscrivo meglio la classe del parging:
Codice (Java): [Seleziona]
public class JsonParser {

    public static ArrayList<Evento> listaEventi = new ArrayList<Evento>();

    private String json;
    private JSONArray jsonArray;


    public JsonParser(String json){
        this.json = json;
        try {
            jsonArray = new JSONArray(json);
        } catch (JSONException e) {
            e.printStackTrace();
        }
    }

    public void jsonParser() throws JSONException{

        for(int i=0; i<jsonArray.length();i++){
            listaEventi.add(new Evento(jsonArray.getJSONObject(i).getString("id"),jsonArray.getJSONObject(i).getString("image"),jsonArray.getJSONObject(i).getString("nome")));
        }
    }
}
E' corretto utilizzare la variabile pubblica listaEventi ed aggiornarla durante il parsing, per poi richiamarla al momento di settare la listview?

Offline pietroconti89

  • Utente normale
  • ***
  • Post: 164
  • Respect: +19
    • Mostra profilo
  • Dispositivo Android:
    Galaxy Note 3 N9005
  • Sistema operativo:
    Windows / Mac OSX
Re:ListView personalizzata
« Risposta #3 il: 14 Novembre 2015, 19:53:30 CET »
0
posta l'intera classe e relativo xml  ;-)

Post unito: 14 Novembre 2015, 19:57:16 CET
comunque su questa pagina Popolare una list view con elementi prelevati da un database - Android Developers Italia   , avevo già mostrato a pieno come fare ciò che ti serve , prova a dargli un occhiata  ;-)
« Ultima modifica: 14 Novembre 2015, 19:57:17 CET da pietroconti89, Reason: Merged DoublePost »

Offline Klizard

  • Utente junior
  • **
  • Post: 62
  • Respect: 0
    • Mostra profilo
Re:ListView personalizzata
« Risposta #4 il: 14 Novembre 2015, 20:23:16 CET »
0
Ho dato un'occhiata al tuo link ed ho provato ad apportare qualche modifica (soprattutto all'adapter) ma non funziona lo stesso..non capisco il motivo.

Parto dall'inizio che forse è meglio.
Ho la classe JsonParser che fa il parsing del Json:
Codice (Java): [Seleziona]
public class JsonParser {
    public static String[] id;
    public static String[] image;
    public static String[] nome;
    public static ArrayList<Evento> listaEventi = new ArrayList<Evento>();


    private String json;
    private JSONArray jsonArray;


    public JsonParser(String json){
        this.json = json;
        try {
            jsonArray = new JSONArray(json);
        } catch (JSONException e) {
            e.printStackTrace();
        }
    }

    public void jsonParser() throws JSONException{
        id = new String[jsonArray.length()];
        image = new String[jsonArray.length()];
        nome = new String[jsonArray.length()];
        for(int i=0; i<jsonArray.length();i++){
            id[i] = jsonArray.getJSONObject(i).getString("id");
            image[i] = jsonArray.getJSONObject(i).getString("image");
            nome[i] = jsonArray.getJSONObject(i).getString("nome");
            listaEventi.add(new Evento(id[i],image[i],nome[i]));
        }
    }
I dati me li salva correttamente (gli array di stringhe id, image e nome sono riempiti correttamente). Vorrei capire se carico correttamente l'arrayList  listaEventi (e se devo usare un arrayList..)


Questo invece è l'xml della riga della listView:
Codice (XML): [Seleziona]
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent"
   android:layout_height="60dp">

    <TextView
       android:layout_width="wrap_content"
       android:layout_height="wrap_content"
       android:text="ID!"
       android:id="@+id/id"
       android:layout_below="@+id/nome"
       android:layout_toRightOf="@+id/immagine"
       android:layout_toEndOf="@+id/immagine" />

    <ImageView
       android:layout_width="50dp"
       android:layout_height="50dp"
       android:id="@+id/immagine"/>

    <TextView
       android:layout_width="wrap_content"
       android:layout_height="wrap_content"
       android:text="nome"
       android:id="@+id/nome"
       android:layout_alignParentTop="true"
       android:layout_toRightOf="@+id/immagine"
       android:layout_toEndOf="@+id/immagine" />

</RelativeLayout>

In pratica devo semplicemente creare una listView con 2 TextView e un'immagine (l'immagine la vorrei caricare tramite l'universal image loader, l'url  lo prelevo dal campo image).
Qualche consiglio?

Grazie!

Offline pietroconti89

  • Utente normale
  • ***
  • Post: 164
  • Respect: +19
    • Mostra profilo
  • Dispositivo Android:
    Galaxy Note 3 N9005
  • Sistema operativo:
    Windows / Mac OSX
Re:ListView personalizzata
« Risposta #5 il: 14 Novembre 2015, 20:36:06 CET »
0
Ciao purtroppo con solo frammenti di codice è difficile individuare il problema ,  indubbiamente l adapter nn è perfetto ma non dovrebbe generare quel tipo di errore ,  il logcat ci dà un errore generico di null point exception  ma non fa riferimento alla riga in cui viene generato .... a questo punto ti jnvito a postare quanto segue

Activity in cui fa la richiesta http il parsingjsonarray e il set della listview
Layout activity

L adapter e il layout delle singole row ,  il logcat completo ... è vediamo un pò

Inviato dal mio SM-N9005 utilizzando Tapatalk


Offline pietroconti89

  • Utente normale
  • ***
  • Post: 164
  • Respect: +19
    • Mostra profilo
  • Dispositivo Android:
    Galaxy Note 3 N9005
  • Sistema operativo:
    Windows / Mac OSX
Re:ListView personalizzata
« Risposta #6 il: 14 Novembre 2015, 20:40:27 CET »
0
Fai anche un print screen del database che mostra correttamente la tabella con tutti i nomi delle sue colonne

Inviato dal mio SM-N9005 utilizzando Tapatalk


Offline Klizard

  • Utente junior
  • **
  • Post: 62
  • Respect: 0
    • Mostra profilo
Re:ListView personalizzata
« Risposta #7 il: 14 Novembre 2015, 20:55:32 CET »
0
Edito tutto che tanto ho riscritto gran parte del codice:
Aggiornamento:
Il problema stava nell'adapter, che ho riscritto così:
Codice (Java): [Seleziona]
public class MyAdapter extends ArrayAdapter<Evento> { //Adapter della listview

    private ImageLoader imageLoader;

    Context context;

    private List<Evento> Object;
    //private static final int TYPE_RIGHT = 1;
    @Override
    public int getViewTypeCount() {
        return 3;
    }
    public MyAdapter(Context C, List<Evento> Object){
        super(C,R.layout.custom_layout,Object);
        this.Object=Object;

        this.context = C;

        //UNIVERSAL IMAGE LOADER SETUP:
        DisplayImageOptions defaultOptions = new DisplayImageOptions.Builder()
                .cacheInMemory(true)
                .cacheOnDisk(true)
                .showImageForEmptyUri(R.drawable.empty_gallery)
                .showImageOnFail(R.drawable.error)
                .showImageOnLoading(R.drawable.loading)
                .build();
        ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(C)
                .threadPriority(Thread.NORM_PRIORITY - 2)
                .denyCacheImageMultipleSizesInMemory()
                .tasksProcessingOrder(QueueProcessingType.LIFO)
                .defaultDisplayImageOptions(defaultOptions)
                .build();
        imageLoader = ImageLoader.getInstance();
        imageLoader.init(config);
    }
    @Override
    public View getView(int P, View convertV, ViewGroup parent){
        ViewHolder vHolder;
        Evento event= Object.get(P);
        if (convertV == null) {
            convertV=LayoutInflater.from(getContext()).inflate(R.layout.custom_layout,null);
            TextView id = (TextView) convertV.findViewById(R.id.id);
            ImageView immagine = (ImageView) convertV.findViewById(R.id.immagine);
            TextView nome = (TextView) convertV.findViewById(R.id.nome);
            vHolder = new ViewHolder(id, immagine, nome);
            convertV.setTag(vHolder);
        } else {
            vHolder = (ViewHolder) convertV.getTag();
        }
        vHolder.getId().setText(event.getId());

        //Log.d("Stringa",event.getImage());
        imageLoader.displayImage(event.getImage(), vHolder.getImmagine());

        vHolder.getNome().setText(event.getImage());

        return convertV;
    }

    public class ViewHolder {
        TextView id;
        ImageView immagine;
        TextView nome;
        public ViewHolder(TextView id, ImageView immagine, TextView nome){
            this.id = id;
            this.immagine = immagine;
            this.nome = nome;
        }
        public TextView getId(){
            return id;
        }
        public ImageView getImmagine(){
            return immagine;
        }
        public TextView getNome() {
            return nome;
        }
    }

}

Ora riesce a caricarmi le immagini però è lentissimo e mi da qualche warning sull'utilizzo eccessivo del thread principale. Devo forse caricare le immagini tramite un Async Class ??

Post unito: 15 Novembre 2015, 14:36:58 CET
Ri-Aggiornamento:
il problema del caricamento era dovuto all'immagine che facevo visualizzare da ogni immagine in fase di caricamento (per prova avevo preso un'immagine immensa...)
« Ultima modifica: 15 Novembre 2015, 14:36:58 CET da Klizard, Reason: Merged DoublePost »

Offline pietroconti89

  • Utente normale
  • ***
  • Post: 164
  • Respect: +19
    • Mostra profilo
  • Dispositivo Android:
    Galaxy Note 3 N9005
  • Sistema operativo:
    Windows / Mac OSX
Re:ListView personalizzata
« Risposta #8 il: 15 Novembre 2015, 14:40:46 CET »
0
Ottimo quindi problema risolto  ;-) vedo che hai migliorato l adapter utilizzando un ArrayAdapter  e performando lo scroll grazie a l uso di un viewholder  :-) bravo !

Post unito: [time]15 Novembre 2015, 14:44:34 CET[/time]
Se posso darti un consiglio lanci le asyntask in maniera assurda 😅 quella parte è migliorabile ,  senza contare che indipendentemente se trova un risultato oppure no gli fai comunque popolare una listview senza elementi ... questo può esser fonte di crash nel caso in cui per qualche motivo la connessione verso il db da un esito non atteso ... tipo la maledettissima scarsità di connessione o la semplice assenza di campi  :-P

Post unito: 15 Novembre 2015, 14:47:59 CET
Ti aggiungo anche che per fare richieste http attualmente usi il sistema standard utilizzando molto codice ,  ma con fai con il caricamento delle immagini che ti affidi a una libreria ,  puoi fare la stessa cosa co una libreria ,  alleggerendo e riducendo di molto le code ,  io mi trovo benissimo con async - http loopj ,  oppure molti usano okhttp,   a te trovare quella che t soddisfa di più  ;-)
« Ultima modifica: 15 Novembre 2015, 14:47:59 CET da pietroconti89, Reason: Merged DoublePost »

Offline Klizard

  • Utente junior
  • **
  • Post: 62
  • Respect: 0
    • Mostra profilo
Re:ListView personalizzata
« Risposta #9 il: 15 Novembre 2015, 15:34:45 CET »
0
Stavo proprio cercando di sistemare la parte relativa alla listview visto che testandola senza connessione internet crasha immediatamente.
Pensavo infatti di inizializzare la listView vuota, per poi aggiungere gli elementi:
Codice (Java): [Seleziona]
List<Evento> prova = new ArrayList<Evento>();
                MyAdapter myAdapter = new MyAdapter(MainActivity.this,prova);
                listView.setAdapter(myAdapter);
                for(int i=0;i<jsonParser.listaEventi.size();i++)
                myAdapter.add(new Evento(jsonParser.listaEventi.get(i).getId(),jsonParser.listaEventi.get(i).getImage(),jsonParser.listaEventi.get(i).getNome()));
Così funziona ma spero di trovare qualcosa di più "presentabile" :D come vedi è molto artificiosa questa soluzione e non mi piace molto..
Per quanto riguarda le Asyntask hai perfettamente ragione: onestamente ho iniziato il progetto partendo da un progetto pre-esistente (è da poco che ho iniziato a programmare in android e quindi preferisco imparare partendo da codice scritto "correttamente" si presume :D).
Come dovrei correggerle? Mi consigli di fare un'unica asyntask in cui scarico ed interpreto il Json ?

Per quanto riguarda invece la libreria per le richieste http c'è qualche differenza in termini di prestazioni o prevenzione crash o altro ? Oppure sarebbe solo un risparmio di codice?

Come avrai intuito in questa app ho spesso dei crash (in particolare se non vi è alcuna connessione internet) quindi vorrei correggere quel che sbaglio..

Grazie mille ancora, mi stai dando davvero un grande aiuto :)

Post unito: 15 Novembre 2015, 16:27:48 CET
Aggiornamento:
Ho deciso di riguardare il codice che mi avevi linkato e devo dire che penso mi risolva tutti i problemi. Lo sto adattando ora alle mie esigenze ma è tutto molto chiaro.
Sto anche testando la libreria per le richieste http di cui mi parlavi (tanto vale iniziare direttamente con questa).

Comunque nel mio vecchio adapter l'imageLoader lo avevo caricato correttamente?
« Ultima modifica: 15 Novembre 2015, 16:27:48 CET da Klizard, Reason: Merged DoublePost »

Offline pietroconti89

  • Utente normale
  • ***
  • Post: 164
  • Respect: +19
    • Mostra profilo
  • Dispositivo Android:
    Galaxy Note 3 N9005
  • Sistema operativo:
    Windows / Mac OSX
Re:ListView personalizzata
« Risposta #10 il: 15 Novembre 2015, 18:06:31 CET »
0
 ;-) con quella libreria risolvi molti problemi, e se segui nel dettaglio come ho spiegato in quel post vedrai che non avrai problemi di crash inattesi per mancanza di connessione o per risultati pari a 0 ... l'adapter va benissimo cosi e anche come implementi l'image Loader , completa l app e eventuali problemi si gestiranno quando ti si presentano :-) buone code

Offline Klizard

  • Utente junior
  • **
  • Post: 62
  • Respect: 0
    • Mostra profilo
Re:ListView personalizzata
« Risposta #11 il: 17 Novembre 2015, 17:52:16 CET »
0
Ragazzi qualcuno mi può spiegare questa diavoleria?
La ListView mi funziona correttamente però se voglio aggiungere degli elementi mi succede quanto segue:
Scrivo il codice ed evidenzio con i commenti la parte a cui mi riferisco
Codice (Java): [Seleziona]
public class Visualizza extends AppCompatActivity implements AdapterView.OnItemClickListener, AbsListView.OnScrollListener{
    private ListView listView;
    private TextView textView;
    private List<Persona> personas = new ArrayList<Persona>();;
    private CustomAdapter customAdapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_visualizza);
        listView = (ListView) findViewById(R.id.listview);
        textView = (TextView) findViewById(R.id.text);

        customAdapter = new CustomAdapter(Visualizza.this,personas);
        listView.setAdapter(customAdapter);
        QuerySelect();

    }
    private void QuerySelect() {
        sincronizzazione=true;
        AsyncHttpClient client = new AsyncHttpClient();
        RequestParams params = new RequestParams();
        String Select= "SELECT * FROM `Persona`";
        params.put("id", Select);
        client.post(Costanti.getUrlLink() + Costanti.getPHPShow(),params, new AsyncHttpResponseHandler() {
            @Override
            public void onStart() {
                super.onStart();
                progressBar.setVisibility(View.VISIBLE);
            }

            @Override
            public void onFinish() {
                super.onFinish();
                progressBar.setVisibility(View.INVISIBLE);
            }

            @Override
            public void onSuccess(int statusCode, Header[] headers, byte[] responseBody) {
                String result = "";
                try {
                    result = new String(responseBody, "UTF-8");
                } catch (UnsupportedEncodingException e) {
                    e.printStackTrace();
                }
                JSONArray jsonArray=null;
                if (!result.equals("null")) {
                    try {
                        jsonArray = new JSONArray(result);
                        parsinJsonArray(jsonArray);
                    } catch (JSONException e) {
                        e.printStackTrace();
                    }
                }

            }

            @Override
            public void onFailure(int statusCode, Header[] headers, byte[] responseBody, Throwable error) {
                Toast.makeText(Visualizza.this, "Connessione Fallita !", Toast.LENGTH_SHORT).show();
            }

        });
    }
    public void parsinJsonArray(JSONArray jsonArray) {
        try {
            for (int i=0; i<jsonArray.length();i++) {
                JSONObject json_data = jsonArray.getJSONObject(i);
                  ////////////////////////////////////////////////////////////////////////////
                ////////                    QUI SOTTO INIZIA IL PROBLEMA               //////////
              /////////////////////////////////////////////////////////////////////////////
                Persona actual_persona=new Persona(json_data.getString(Costanti.getKayId()),json_data.getString(Costanti.getKayImage()),json_data.getString(Costanti.getKayNome()), json_data.getString(Costanti.getKayCognome()));
                /* 1 */ personas.add(actual_persona);
                /* 2 */ customAdapter.add(actual_persona);
                /* 2 */ customAdapter.remove(actual_persona);
            }
        }catch (JSONException e) {
            e.printStackTrace();
        }
    }

Il problema è che se voglio aggiungere un nuovo elemento nella listView, se lo aggiungo SOLO alla lista o SOLO all'adapter (commentando quindi la parte 1 o la parte 2) la lista rimane vuota; se invece lascio così com'è funziona. Perchè?!? Cosa mi sfugge?

Grazie a chiunque mi illumini :)

Offline pietroconti89

  • Utente normale
  • ***
  • Post: 164
  • Respect: +19
    • Mostra profilo
  • Dispositivo Android:
    Galaxy Note 3 N9005
  • Sistema operativo:
    Windows / Mac OSX
Re:ListView personalizzata
« Risposta #12 il: 17 Novembre 2015, 18:04:47 CET »
+1
magari non lo hai messo perchè ti è scappato... ma qui non setti mai l'adapter .... nel caso in cui lo setti da qualche parte " che qui non vedo " e il tuo intento è fare questo  --->

l'activity si avvia
fa una ricerca dei dati che mette in personas e setta l'adapter
fatto ciò fai una nuova ricerca in cui sono presenti nuovi elementi
quindi  " personas " comprenderà nuovi dati , allora una volta che lo hai aggiornato devi semplicemente notificare a l'adapter l'aggiornamento di personas .... in questo modo

Codice (Java): [Seleziona]
personas.add(actual_persona);
customAdapter.notifyDataSetChanged();


Offline Klizard

  • Utente junior
  • **
  • Post: 62
  • Respect: 0
    • Mostra profilo
Re:ListView personalizzata
« Risposta #13 il: 17 Novembre 2015, 18:06:40 CET »
0
magari non lo hai messo perchè ti è scappato... ma qui non setti mai l'adapter .... nel caso in cui lo setti da qualche parte " che qui non vedo " e il tuo intento è fare questo  --->

l'activity si avvia
fa una ricerca dei dati che mette in personas e setta l'adapter
fatto ciò fai una nuova ricerca in cui sono presenti nuovi elementi
quindi  " personas " comprenderà nuovi dati , allora una volta che lo hai aggiornato devi semplicemente notificare a l'adapter l'aggiornamento di personas .... in questo modo

Codice (Java): [Seleziona]
personas.add(actual_persona);
customAdapter.notifyDataSetChanged();


Mi hai bruciato nel tempo..avevo appena trovato la soluzione..pensavo che il refresh avvenisse in automatico e invece bastava inserire quella riga
Grazie :D

Offline LonelyWolf

  • Utente junior
  • **
  • Post: 148
  • Respect: +12
    • Mostra profilo
    • Traversate dei laghi
  • Dispositivo Android:
    GT-I9505, ALE-L21
  • Sistema operativo:
    Windows 7 32/64
Re:ListView personalizzata
« Risposta #14 il: 17 Novembre 2015, 18:07:37 CET »
+1
Perchè la lista è una lista e l'adapter e un adapter, insieme fanno il loro lavoro.
L'adapter prende i valori della lista e li "mette" nella listview, se uno dei due manca il risultato è vuoto.

Aggiungi l'elemento alla lista e poi dici all'adapter che il dataset è cambiato:

Codice: [Seleziona]
personas.add(actual_persona);
customAdapter.notifyDataSetChanged();

Edit:
Tutti con la stessa risposta! :D
Se la mia risposta ti è utile, per favore un thanks!