Autore Topic: ListVew -> Da elemento selezionato, estrarre un aggiuntivo valore  (Letto 611 volte)

Offline App2.0

  • Nuovo arrivato
  • *
  • Post: 4
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Lg G2 Mini
  • Sistema operativo:
    Windows 7
0
Ciao a tutti

mi sono appena registrato su questo forum. Premetto che sono un super novellino in materia Java - Android per cui abbiate pazienza, almeno all'inizio in quanto sono già abbastanza confuso. :-)  Provengo da PHP - ASP  .. e tutto qui mi sembra assurdamente complesso...

Ad ogni modo vi espongo il mio "problema".

Ho una tabella RISTORANTE nella quale sono presenti questi campi
- id
- nome
- citta
- note
- telefono

In una activity ho creato uno spinner che elenca tutte le città gia presenti in archivio. L'utente sceglie una città, e il programma mostra in una ListView tutti i ristoranti che ha trovato in quella citta.
Fin qui tutto ok !
Esempio:

SPINNER -> Scelgo Milano

->LA ListView riporta poi queste righe:

Da Ciccio, ristorante bello e caro
Da Pippo, buona la pizza
Da Marco, fa tutto schifo


Ora quello che vorrei fare è : clicco sopra ad uno di questi ristoranti e apro una seconda Activity alla quale passo l''ID del ristorante, per visualizzarne i dettagli e volendo anche per modificare o cancellare il ristorante.

Ho fatto un po di test, sono riuscito ad intercettare il Click e il LongClick sopra al singolo elemento ma riesco solo a vedere la stringa di testo che viene visualizzata a schermo. Non sono in grado per cui, di ottenere l'ID del ristorante sul quale ho modificato per poi usarlo come mi pare.

Mi potete dare una mano? Anche dal punto di vista teorico.. come faccio a passare un valore se non lo visualizzo? Sarebbe ovviamente molto facile  e so come fare , passare la stringa che vedo a video, ma questo dal punto di vista funzionale non avrebbe senso perché ovviamente in caso di posti omologhi, rischio di modificare quello errato!

Grazie e buone App a tutti :-)

Offline tonno16

  • Utente storico
  • *****
  • Post: 1227
  • Respect: +59
    • Mostra profilo
  • Dispositivo Android:
    moto g
  • Play Store ID:
    Diego Tonini
  • Sistema operativo:
    OpenSuse
Re:ListVew -> Da elemento selezionato, estrarre un aggiuntivo valore
« Risposta #1 il: 21 Aprile 2015, 17:41:41 CEST »
0
quando dici tabella intendi dire che hai usato sqlite?

IN CASO AFFERMATIVO:
Devi o dovresti riempire la lista con un cursorAdapter.
Dal cursor adapter al click ricavi il cursor di quella posizione.

IN ALTRO CASO:
Presumo hai un oggetto Ristorante, con 2 o più setter per impostare nome, via telefono, e relativi getter
Usi un custom adapter dichiarato cosi: RistoAdapter<Risto> ristoAdaptet = new RistoAdapter(...);
In questo caso quando clicchi sulla lista, se hai implementato OnItemClickListener, il metodo ritorna un intero riferito alla posizione cliccata (come nell' esempio sopra ovviamente).
Dunque chiami ristoAdapter.getItemAtPosition(intero_posizione). Il metodo ritorna un oggetto di tipo Ristorante.
Ora basta che chiami il metodo .getNomeRisto() dall' oggetto appena ottenuto con getItem(),

Il discorso "IN ALTRO CASO" è uguale a quello col cursor. Un cursor è qualcosa riempito di dati. Puoi accedere a tali dati scorrendo in orizzontale le colonne e in riga i record. Quindi il cursor è una sorta di tabella.
Un cursor del tipo:
------------------------
---id---------nome-----
--001--------da mario--

Potresti fare: Risto r = new Risto(cursor.getString(0),cursor.getString(1);
Crei un oggetto Risto estrappolando 2 stringhe dal cursore.
« Ultima modifica: 21 Aprile 2015, 17:49:34 CEST da tonno16 »

Offline App2.0

  • Nuovo arrivato
  • *
  • Post: 4
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Lg G2 Mini
  • Sistema operativo:
    Windows 7
Re:ListVew -> Da elemento selezionato, estrarre un aggiuntivo valore
« Risposta #2 il: 21 Aprile 2015, 18:23:21 CEST »
0
Intanto grazie per la velocissima risposta.  Uso una tabella sqlite e ho usato un cursor adaptor come dici tu.  L'ho riempito coi nomi dei ristoranti che escono dalla query ed i risultati sono più o meno quelli che ho messo. 

Per cui nel array ho messo i nomi dei ristoranti. Poi per comodità ho provato a concatenare vari valori come ad esempio il campo ID il campo Nome e il campo note...  in questo modo a video vedo tutti i dati che mi interessano ma nell array che memorizza i dati ho inserito soltanto il nome altrimenti a video anziche il nome dei ristoranti vedrai una serie di numeri che avrebbero poco senso.

Post unito: 21 Aprile 2015, 18:27:01 CEST
Dimenticavo una cosa.  Il cursore da un intero che rappresenta la posizione della voce in quella elenco ma non ha alcun legame con il mio id.  Per cui sapere che da Mario e in posizione 2 o 3 che mi interessa quando la id e magari 25?
« Ultima modifica: 21 Aprile 2015, 18:27:01 CEST da App2.0, Reason: Merged DoublePost »

Offline tonno16

  • Utente storico
  • *****
  • Post: 1227
  • Respect: +59
    • Mostra profilo
  • Dispositivo Android:
    moto g
  • Play Store ID:
    Diego Tonini
  • Sistema operativo:
    OpenSuse
Re:ListVew -> Da elemento selezionato, estrarre un aggiuntivo valore
« Risposta #3 il: 21 Aprile 2015, 19:00:37 CEST »
0
Ipotizzo che hai un Oggetto di tipo Risto contiene 3 campi id, nome , via

Se usi una ArrayAdapter che sia custom o base, allora avrai:
- Una listView
- Una Lista di Risto: List<Risto> list = new ArrayList<>();
- Un RistoAdapter che estende ArrayAdapter.
In questo caso non te ne fai niente del campo id all' interno di un oggetto Risto.

Se usi un cursoAdapter avrai:
-Una listView
-Una Cursor
- Un RistoAdapter che estende CursorAdapter
In questo caso Il Cursor è il risultato della query: "select id,nome,via from tbl_risto".
Quindi avrò tante righe quanti sono i ristoranti. Ogni riga ha 3 colonne che sono appunto id nome e via.
A sei nell' activity A, selezioni qualcosa dalla lista, e vuoi aprire l' Activity B per avere altre ipotetice informazioni, passi in B l'id. E poi in B farai tutte le query ti editing riferiti al ristorante con id selezionato.
Ovvio che lo puoi fare anche passando il nome, ma se sai un minimo di sql ( e credo tu lo sappia) sai anche l' importanza di una chiave con valore univoco.

quando chiami getItemAtPos o nome simila sull' adapter, se sei nel ArrayAdapter allora esso ritorna l'oggetto di tipo Custom.
Quindi un RistoAdapter<Risto> ritorna un oggetto di tipo Risto.
Se chiami lo stesso metodo in un cursorAdapter, esso ti ritorna un cursor. Ovvero 1 sola riga con 3 colonne.
se li fai cursor.getInt(0), ottieni l' id del ristorante scelto.

OSSERVAZIONE:
ovviamente il costruttore di Risto non prende in input un intero che rappresenta l'id, perchè ovviamente tu non lo sai. Se hai messo auto increment allora si genera da solo.
però avrai la tua classe DBHelper credo che avra l'oggetto SQLIteDatabase e altri metodo a te utili.
Avrai anche; public Cursor getRistoranti(), che ritorna tutti i ristoranti.
Quindi quando clicchi nella lista puoi ottenere l' id.

Se tu è utile puoi creare una classe statica ( a tua scelta ), dove scrivi dei metodi del tipo:
getListRestaurantFromCursor(Cursor c). Tale metodo potrebbe darti una lista a partire da un cursor.

Alla fine potresti anche Utilizzare un normale ArrayAdapter che prende in input una lista e utilizzare contemporaneamente i cursori, ma se android mette a disposizione CursorAdapter allora c'è un motivo.
Questo metodo dell avere una lista da un cursore, potrebbe comunque servirti per debug o altro.

Ti consiglio di usare SQLiteDatabaseBrowser

Offline App2.0

  • Nuovo arrivato
  • *
  • Post: 4
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Lg G2 Mini
  • Sistema operativo:
    Windows 7
Re:ListVew -> Da elemento selezionato, estrarre un aggiuntivo valore
« Risposta #4 il: 22 Aprile 2015, 10:08:50 CEST »
0
Ciao Tonno

è da ieri sera che leggo il tuo commento e faccio molta fatica a seguire tutti i passi che hai elencato, purtroppo la mia attuale conoscenza dell'ambiente non mi permette di capire tutto come vorrei ..

Ti mostro una parte del SW che ho creato finora perché, leggendo le tue spiegazioni, temo manchi qualche passaggio.

Questa è la parte "iniziale" quando estendo la classe principale MainActivity:
Codice (Java): [Seleziona]
public class MainActivity extends Activity implements AdapterView.OnItemSelectedListener {

    private funzioni mioDatabaseHelper;
@Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        mioDatabaseHelper = new funzioni(this);

        setContentView(R.layout.activity_main);

        // Accedo allo SPINNER per selezionare la città interessata
        Spinner spinner = (Spinner) findViewById(R.id.spinner_scelta_citta);
        ListView listaViewRistoranti = (ListView) findViewById(R.id.listView_elenco_ristoranti);

        /* ++++ CARICAMENTO DEI DATI DAL DB++++++++++ */

        int contatore = 0;
        SQLiteDatabase db = mioDatabaseHelper.getReadableDatabase();

        String[] colonne =  {"DISTINCT(citta)"};
        String orderBy = "citta";

        Cursor cursor= db.query("ristorante", colonne, null, null, null,null, orderBy);

        int numeroCitta = cursor.getCount();
        String[] cittaTrovate = new String[numeroCitta];

        while (cursor.moveToNext()) {
            String cittaTrovata = cursor.getString(0).trim();
            cittaTrovate[contatore]= cittaTrovata;
            contatore += 1;
        }

        ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item, cittaTrovate);

        spinner.setAdapter(adapter);
        spinner.setOnItemSelectedListener(this);

        // Faccio click su un ristorante presente nello SPINNER in alto.
        listaViewRistoranti.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                // position = posizione che occupa nella lista. Non è l'id !
                Log.d("SINGOLO CLICK: ",""+position + "-"+id);

            }
        });

        // Faccio LUNGO CLICK su un ristorante presente nella lista
        listaViewRistoranti.setOnItemLongClickListener(new OnItemLongClickListener()
        {
            @Override
            public boolean onItemLongClick(AdapterView<?> adapterView, View view, int position, long id)
            {
                Log.d("CLICK LUNGO: ", "" + position + "-"+id);
                return true;
            }
        });
        /* +++++++++++   */
}



Questa invece è la parte che si occupa di mostrare nella ListView i ristoranti che sono stati trovati dopo che ho fatto click sull'oggetto SPINNER che contiene le città. Esempio: scelgo Milano, e nella ListView mostro tutti i ristoranti che trova a Milano.
NOTA : la parte in cui concateno la stringa da mostrare a video.. in alternativa.. non si può creare un Array bidimesionale nel quale mettere l'id del ristorante e il nome e dal quale poi prelevare solo l'id in qualche maniera?

Codice (Java): [Seleziona]
    // Quando clicco sullo SPINNER delle citta scateno questo evento
    @Override
    public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {

        String item = parent.getItemAtPosition(position).toString();

            /* ++++ CARICAMENTO DEI DATI DAL DB++++++++++ */

        SQLiteDatabase db = mioDatabaseHelper.getReadableDatabase();

        String[] colonne =  {"_id", "nome", "telefono" , "note"};
        String selezione = "citta =?";
        String[] selArg = {item};
        String orderBy = "nome ASC";
       
        Cursor cursor= db.query("ristorante", colonne, selezione, selArg, null, null, orderBy);

        int numeroRistoranti = cursor.getCount();

        final ArrayList<String> listaRistoranti = new ArrayList<>();

        while (cursor.moveToNext()) {
            // Questo è ciò che mostro a video: 3 campi concatenati.
            String cittaTrovata = cursor.getString(0).trim() + "-" + cursor.getString(1).trim() +", " + cursor.getString(3).trim() ;
            listaRistoranti.add(cittaTrovata);
        }

        final ListView lstListaRistoranti = (ListView) findViewById(R.id.listView_elenco_ristoranti);
        final ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, listaRistoranti);

        lstListaRistoranti.setAdapter(adapter);

    }