Autore Topic: Popolare ListView da una pagina di aggiunta  (Letto 391 volte)

Offline rirri

  • Nuovo arrivato
  • *
  • Post: 3
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Nexus 5
  • Sistema operativo:
    Mac OS X 10.9.5
Popolare ListView da una pagina di aggiunta
« il: 11 Ottobre 2014, 14:28:30 CEST »
0
Ciao a tutti, spero di aver centrato la sezione giusta.

Vi spiego il problema. Voglio creare un'applicazione in cui in prima pagina ho una ListView. Per aggiungere elementi alla ListView ho aggiunto un pulsante sulla ActionBar. Quindi l'utente deve inserire i dati dall'activity chiamata Add. Questi dati poi devono essere elaborati e mostrati all'interno della ListView inserita nella MainActivity.
Ho fatto praticamente tutto, l'unica cosa che non riesco a fare è passare i dati creati in Add in un vettore in MainActivity. Come si fa??

Offline alfy91

  • Nuovo arrivato
  • *
  • Post: 28
  • Respect: +2
    • @piscitelli91
    • Mostra profilo
  • Dispositivo Android:
    Nexus 5
  • Sistema operativo:
    Windows 8
Re:Popolare ListView da una pagina di aggiunta
« Risposta #1 il: 11 Ottobre 2014, 15:54:42 CEST »
0
Ciao rirri, benvenuto nel forum :)

Potresti fare in questo modo, che non so quanto sia pulito, ma è l'unico che mi viene in mente in questo momento  :D :D
Nel main activity dovresti crearti un metodo statico in cui ti salvi l'istanza del MainActivity.  Poi un altro metodo che chiamerai add(TuoElemento e) che non farà altro che aggiungere il tuo elemento "e" all'array. Infine, sempre nel MainActivity, devi sovrascrivere il metodo onResume in modo che venga aggiornato il list view. Quindi, richiami il tuo adapter e invochi questo metodo:

Codice: [Seleziona]
tuoadap.notifyDataSetChanged();
Nell'activity add, richiami la tua istanza statica e invochi il metodo add, aggiungendo l'entry. Poi chiudi l'activity Add e dovresti trovare l'entry aggiunta :)
Facci sapere.

Offline marco4098

  • Nuovo arrivato
  • *
  • Post: 4
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    galaxys2
  • Sistema operativo:
    win8
Re:Popolare ListView da una pagina di aggiunta
« Risposta #2 il: 13 Ottobre 2014, 12:12:35 CEST »
0
Io ho avuto un problema quasi identico, e quando aggiungevo un item alla view sepmlicemente il mio metodo richiamava "onResume();" e si aggiornava.

Offline rirri

  • Nuovo arrivato
  • *
  • Post: 3
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Nexus 5
  • Sistema operativo:
    Mac OS X 10.9.5
Re:Popolare ListView da una pagina di aggiunta
« Risposta #3 il: 14 Ottobre 2014, 20:57:20 CEST »
0
Grazie per le risposte.
Purtroppo non sono molto esperto e nel risolvere un problema, ne è venuto fuori un altro: cerco di spiegarmi. Sono riuscito a passare i miei dati dall'activity Add alla MainActivity. A questo punto devo creare un oggetto e creare un ArrayList di questi oggetti. E l'ho fatto. Quando vado ad inserire il primo dato tutto ok, inserisco, passa i dati e lo inserisce correttamente nella list. Il problema arriva quando vado ad inserire il secondo: invece di aggiungerlo in coda, lo sovrascrive al primo! Dove sbaglio?

Vi riporto il codice Java della MainActivity

Codice (Java): [Seleziona]
package com.example.mionome.nomeapp;

import android.content.Intent;
import android.content.SharedPreferences;
import android.preference.PreferenceManager;
import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.SimpleAdapter;

import java.lang.reflect.Type;
import java.util.List;

//import com.google.gson.Gson;
//import com.google.gson.annotations.SerializedName;
//import com.google.gson.reflect.TypeToken;

import java.util.ArrayList;
import java.util.HashMap;


public class MainActivity extends ActionBarActivity {
    Intent intent;

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

        Intent intent=getIntent();
        String pkg=getPackageName();
        String nome=intent.getStringExtra(pkg+".myNome");
        String prof=intent.getStringExtra(pkg+".myProf");
        int voto=intent.getIntExtra(pkg+".myVoto",-1);
        int crediti=intent.getIntExtra(pkg+".myCrediti",-1);
        String codice=intent.getStringExtra(pkg+".myCodice");
        String note=intent.getStringExtra(pkg+".myNote");
        int photoRes=intent.getIntExtra(pkg+".myPhotores",-1);

        Esame ciao= new Esame (nome,prof,voto,crediti,codice,note,photoRes);

        ArrayList<Esame>listEsami= new ArrayList<Esame>();
        Esame[] esami={};

       listEsami.add(ciao);

       //Gson gson= new Gson();
       //String jsonEsami=gson.toJson(listEsami);

        //new Esame("Analisi Matematica 1","prof. Paolo Nistri", 30,9,"100074D","nn",0),
                //new Esame("Fondamenti di Informatica","prof. Marco Gori",30,12,"101978D","nn",0),
                //new Esame("Analisi Matematica 2","prof. Alessandra Andreini",22,9,"100075D","nn",0)

        //for(int i=0;i<esami.length;i++){
            //listEsami.add(esami[i]);
        //}

        //Type type = new TypeToken<List<Esame>>(){}.getType();
        //List<Esame> carsList = gson.fromJson(jsonEsami, type);
        ArrayList<HashMap<String, Object>> data=new ArrayList<HashMap<String,Object>>();
        for(int i=0;i<listEsami.size();i++){
            Esame e=listEsami.get(i);

            HashMap<String,Object> esamMap=new HashMap<String, Object>();//creiamo una mappa di valori

            esamMap.put("image", e.getPhotoRes()); //
            esamMap.put("nome", e.getNome()); //
            esamMap.put("prof", e.getProf());//
            esamMap.put("voto", e.getVoto());//
            esamMap.put("crediti", e.getCrediti());//
            esamMap.put("codice", e.getCodice());//
            esamMap.put("note", e.getNote());//
            esamMap.put("photores", e.getPhotoRes());//

            data.add(esamMap);
        }


        String[] from={"image","nome","prof","voto","crediti","codice","note","photores"}; //dai valori contenuti in queste chiavi
        int[] to={R.id.personImage,R.id.titolo_esame,R.id.professore,R.id.voto,R.id.numcrediti,R.id.codice,R.id.note};//agli id delle view

        SimpleAdapter adapter=new SimpleAdapter(
                getApplicationContext(),
                data,//sorgente dati
                R.layout.list_item, //layout contenente gli id di "to"
                from,
                to);
        ((ListView)findViewById(R.id.listView)).setAdapter(adapter);

    }

    public class Esame {
        private String nome;
        private String prof;
        private int voto;
        private int crediti;
        private String codice;
        private String note;
        private int photoRes;
        public Esame(String nome, String prof, int voto, int crediti, String codice, String note, int photoRes) {
            super();
            this.nome = nome;
            this.prof = prof;
            this.voto = voto;
            this.crediti=crediti;
            this.codice=codice;
            this.note=note;
            this.photoRes= photoRes;
        }
        public String getNome() {
            return nome;
        }
        public String getProf() {
            return prof;
        }
        public int getVoto() {
            return voto;
        }
        public int getCrediti(){
            return crediti;
        }
        public String getCodice(){
            return codice;
        }
        public String getNote(){
            return note;
        }
        public int getPhotoRes(){
            return photoRes;
        }
    }



    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        MenuInflater inflater= getMenuInflater();
        inflater.inflate(R.menu.activity_actions, menu);
        return super.onCreateOptionsMenu(menu);
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch(item.getItemId()){
            case R.id.action_add:
                Intent openPageAdd=new Intent(MainActivity.this,Add.class);
                startActivity(openPageAdd);
                return true;
            default:
                return super.onOptionsItemSelected(item);

        }

    }

}

Offline alfy91

  • Nuovo arrivato
  • *
  • Post: 28
  • Respect: +2
    • @piscitelli91
    • Mostra profilo
  • Dispositivo Android:
    Nexus 5
  • Sistema operativo:
    Windows 8
Re:Popolare ListView da una pagina di aggiunta
« Risposta #4 il: 15 Ottobre 2014, 09:23:28 CEST »
0
Sbagli nel fatto che, passando dall'Add Activity alla Main Activity, viene ricreato l'arraylist con il solo elemento che hai passato dall'Add.


Prova a fare così. :)

Codice (Java): [Seleziona]
package com.example.mionome.nomeapp;

import android.content.Intent;
import android.content.SharedPreferences;
import android.preference.PreferenceManager;
import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.SimpleAdapter;

import java.lang.reflect.Type;
import java.util.List;

//import com.google.gson.Gson;
//import com.google.gson.annotations.SerializedName;
//import com.google.gson.reflect.TypeToken;

import java.util.ArrayList;
import java.util.HashMap;


public class MainActivity extends ActionBarActivity {
    Intent intent;
    private static MainActivity instance;
    ArrayList<HashMap<String, Object>> data;
   SimpleAdapter adapter = null;
    public MainActivity() {

    data = new ArrayList<HashMap<String,Object>>();

    }
    public static MainActivity getInstance() {
       if(instance==null) instance = new MainActivtity();
       return instance;
    }
   
    public void addData(HashMap<String,Object> esamMap) {
       data.add(esamMap);
    }

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

       
     
        /*
        //Questo lo fai nella classe Add
           
            HashMap<String,Object> esamMap=new HashMap<String, Object>();//creiamo una mappa di valori
            esamMap.put("image", e.getPhotoRes()); //
            esamMap.put("nome", e.getNome()); //
            esamMap.put("prof", e.getProf());//
            esamMap.put("voto", e.getVoto());//
            esamMap.put("crediti", e.getCrediti());//
            esamMap.put("codice", e.getCodice());//
            esamMap.put("note", e.getNote());//
            esamMap.put("photores", e.getPhotoRes());//
            MainActivity.getInstance().addData(esamMap);
           
         //A questo punto chiudi l'activity add con il metodo finish();  
           
        */


        String[] from={"image","nome","prof","voto","crediti","codice","note","photores"}; //dai valori contenuti in queste chiavi
        int[] to={R.id.personImage,R.id.titolo_esame,R.id.professore,R.id.voto,R.id.numcrediti,R.id.codice,R.id.note};//agli id delle view

        adapter=new SimpleAdapter(
                getApplicationContext(),
                data,//sorgente dati
                R.layout.list_item, //layout contenente gli id di "to"
                from,
                to);
        ((ListView)findViewById(R.id.listView)).setAdapter(adapter);

    }

    public void onResume() {
        adapter.notifyDataSetChanged();    
    }
   
    public class Esame {
        private String nome;
        private String prof;
        private int voto;
        private int crediti;
        private String codice;
        private String note;
        private int photoRes;
        public Esame(String nome, String prof, int voto, int crediti, String codice, String note, int photoRes) {
            super();
            this.nome = nome;
            this.prof = prof;
            this.voto = voto;
            this.crediti=crediti;
            this.codice=codice;
            this.note=note;
            this.photoRes= photoRes;
        }
        public String getNome() {
            return nome;
        }
        public String getProf() {
            return prof;
        }
        public int getVoto() {
            return voto;
        }
        public int getCrediti(){
            return crediti;
        }
        public String getCodice(){
            return codice;
        }
        public String getNote(){
            return note;
        }
        public int getPhotoRes(){
            return photoRes;
        }
    }



    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        MenuInflater inflater= getMenuInflater();
        inflater.inflate(R.menu.activity_actions, menu);
        return super.onCreateOptionsMenu(menu);
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch(item.getItemId()){
            case R.id.action_add:
                Intent openPageAdd=new Intent(MainActivity.this,Add.class);
                startActivity(openPageAdd);
                return true;
            default:
                return super.onOptionsItemSelected(item);

        }

    }

}
« Ultima modifica: 15 Ottobre 2014, 09:29:39 CEST da alfy91 »

Offline rirri

  • Nuovo arrivato
  • *
  • Post: 3
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Nexus 5
  • Sistema operativo:
    Mac OS X 10.9.5
Re:Popolare ListView da una pagina di aggiunta
« Risposta #5 il: 15 Ottobre 2014, 22:37:34 CEST »
0
Grazie alfy91 per la risposta ma c'è un problemino... Quando vado a portare la porzione di codice che mi hai indicato tu in Add, non viene riconosciuta la variabile "e", infatti veniva dichiarata in una delle istruzioni che hai eliminato insieme al ciclo for. Ti reinserisco il codice commentando la parte che c'era prima e che hai tolto
Codice (Java): [Seleziona]
   //for(int i=0;i<listEsami.size();i++) {
                    //Esame e = listEsami.get(i);
                    HashMap<String, Object> esamMap = new HashMap<String, Object>();//creiamo una mappa di valori

                    esamMap.put("image", e.getPhotoRes()); //
                    esamMap.put("nome", e.getNome()); //
                    esamMap.put("prof", e.getProf());//
                    esamMap.put("voto", e.getVoto());//
                    esamMap.put("crediti", e.getCrediti());//
                    esamMap.put("codice", e.getCodice());//
                    esamMap.put("note", e.getNote());//
                    esamMap.put("photores", e.getPhotoRes());//
                    MainActivity.getInstance().addData(esamMap);

                    startActivity(intent);
                //}

Anche se ho notato che ri-aggiungendo la dichiarazione di "e" e il ciclo for, non viene riconosciuto listEsami  :-(