Autore Topic: leggere il db e costruire il layout dinamicamente.  (Letto 654 volte)

Offline daniweb

  • Nuovo arrivato
  • *
  • Post: 30
  • Respect: +1
    • Mostra profilo
  • Dispositivo Android:
    galaxy s2
  • Sistema operativo:
    windows 7
leggere il db e costruire il layout dinamicamente.
« il: 13 Marzo 2013, 20:17:25 CET »
0
Ciao a tutti,
mi son trovato nella condizione di voler modifcare la struture del programma che stavo realizzando e volevo da voi un consiglio se la strada scelta è corretta o se è meglio proseguire per altre vie.

prima avevo un DB strutturato in questa maniera.

tabella CLASSE
colonne: _id, descri, ins, stud1, stud2, stud3, .....stud20

ho deciso di dividere la tabelle in due collegate tra loro.
tabella CLASSE
colonne: _id, descri

tabella STUDENTE
colonne: _id, classe, descri

l'obbiettivo sarebbe di avere un form con campi input creati e caricati dinamicamente.

tornando all'esempio delle classi...
dalla pagina lista classi, seleziono la calsse
Codice (Java): [Seleziona]
protected void onListItemClick(ListView l, View v, int position, long id) {
                super.onListItemClick(l, v, position, id);
                Cursor c = (Cursor) (this.getListAdapter().getItem(position));
                if (c != null) {
                        mDbHelper.close();
                        Intent i = new Intent(this, Classe.class);
                        i.putExtra("scuolaID", ScuolaID);
                         i.putExtra("classeDESCRI", c.getString(c.getColumnIndexOrThrow(ClasseTable.DESCRI)));
                        startActivity(i);
                         this.finish();
                }
        }

nella pagine del form della classe recupero le informazioni
Codice (Java): [Seleziona]
Bundle extras = getIntent().getExtras();
if (extras != null)
{
       ClasseID= extras.getString("classeID");
       String DescrizioneClasse = extras.getString("classeDESCRI");
       .....
       .....
       //associo i dati alle textview se l'id è maggiore di zero
       if(ClasseID>0)
       {
             if (DescrizioneClasse != null) { editDescrizioneClasse.setText(DescrizioneClasse ); }
             .....
             .....
con questo metodo, forse scritto in maniera non ottimizzata o pessima, tutto funzionava.
avendo deciso di avere un numero di righe (studenti) dinamiche, ho pensato di recuperare i dati dalla tabella degli studenti ma mi sono bloccato con il problema della variabile.
Codice (Java): [Seleziona]
righeCursor = mDbHelper.listaRigheStudenti(ClasseID);
if (righeCursor.moveToFirst()) {
     int x = 0;
     do {
          x=x+1;
          String TipoStudente=righeCursor.getString(righeCursor.getColumnIndexOrThrow(StudentiTable.TIPO));
          if (TipoStudente!= null)
          {
               int pos= Rigoadapter.getPosition(TipoStudente);
               spinnerTipoStudente.setSelection(pos);
          }
          //TENTATIVO DI VARIABILE DINAMICA TRAMITE  dictionary
          d["editDescrizioneStudente{0}".format(x)]=(righeCursor.getString(righeCursor.getColumnIndexOrThrow(StudentiTable.DESCRI)));

          String Ripetente=righeCursor.getString(righeCursor.getColumnIndexOrThrow(StudentiTable.RIPETENTE));
          if (Ripetente!=null) { editVenduto1.setChecked(true); }
      }
     while (righeCursor.moveToNext());
}

in pratica creo il cursore degli alunni.
eseguo un ciclo.

nel ciclo pensavo di assegnare i valori recuperati dal DB a delle variabili dinamiche, e poi generare il layout in base alle variabili recuperate.
ovviamente lo script sovrastante contiene degli errori (mismatch in format(x) )
mi rendo conto che forse è una ripetizione inutile e che probabilmente è meglio creare il layout all'interno del ciclo.

ecco, volevo un consiglio da voi.
va bene recuperare i dati in questo modo?
una volta recuperati per creare il layout cosa potrei fare? creare delle variabili o un array e poi ciclarlo per creare il layout o creare il layout mentre recupero i dati dal DB direttamente ? o quale altra ipotesi potrei fare?

grazie per tutti i suggerimenti che potrete darmi.

Offline bradipao

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 4043
  • keep it simple
  • Respect: +567
    • Github
    • Google+
    • bradipao
    • Mostra profilo
  • Dispositivo Android:
    Nexus 5
  • Play Store ID:
    Bradipao
  • Sistema operativo:
    W7
Re:leggere il db e costruire il layout dinamicamente.
« Risposta #1 il: 14 Marzo 2013, 07:54:00 CET »
0
Premetto che non ho ben capito come deve essere il tuo layout finale.

Però, quando hai a che fare con un elenco di lunghezza non prefissata o comunque non breve (esempio elenco studenti), l'ideale è associarlo ad una listView. Questo approccio ti semplifica enormemente tutto il lavoro, perchè è la listView a occuparsi di gestire la dinamicità del layout (numero di righe non prefissato) e con l'opportuno adapter hai anche automaticamente l'interazione con il database.

Non può andare bene per il tuo caso?
NON rispondo a domande nei messaggi privati
Bradipao @ Play Store

Offline daniweb

  • Nuovo arrivato
  • *
  • Post: 30
  • Respect: +1
    • Mostra profilo
  • Dispositivo Android:
    galaxy s2
  • Sistema operativo:
    windows 7
Re:leggere il db e costruire il layout dinamicamente.
« Risposta #2 il: 14 Marzo 2013, 10:34:29 CET »
0
Ciao,

attualmente la pagina con il form di creazione /modifica sarà una pagina contenente una base di 15 campi.
3 o 4 di questi sono spinner gli altri sono edittext.

dopodichè, con la pressione di un pulsante dovrebbe essere possibile aggiungere un gruppo di textview e uno spinner.
questo gruppo è la parte relativa agli studenti.
Se invece è una modifica devono comparire in automatico in base a quanti sono.

il semplice listato scrollabile già lo uso in altre pagine quindi più o meno ho idea di come realizzarlo per scrivere una lista.

Scrivere però un gruppo di campi input, che vengano popolati o meno in base alle informazioni è un'altro paio di maniche.

fino ad ora quel poco che ho fatto di android è stato usare pagine xml per il layout e non l'ho mai costruito nella classe.
per farlo avrei necessità di alcune indicazioni su come legae la sua costruzione con i dati del db.

come scrivevo precedentemente pensavo di realizzare delle variabili dinamiche, ma credo sia la procedura errata.

probabilmente dovrei creare un metodo che crei la sezione studente del form e quando ciclo il cursore richiamarlo per avere i dati scritti.

tipo :

Codice (Java): [Seleziona]
public class Bene extends Activity implements OnClickListener{
       
public void onCreate(Bundle icicle)
{

          Bundle extras = getIntent().getExtras();
          if (extras != null)
          {
              ClasseID= extras.getString("classeID");
              String DescrizioneClasse = extras.getString("classeDESCRI");
               .....
              .....
               //associo i dati alle textview se l'id è maggiore di zero
              if(ClasseID>0)
              {
                      if (DescrizioneClasse != null) { editDescrizioneClasse.setText(DescrizioneClasse ); }
                     .....
                     .....
                    righeCursor = mDbHelper.listaRigheStudenti(ClasseID);
                    if (righeCursor.moveToFirst()) {
                         int x = 0;
                         do {
                              x=x+1;
                              //richiama il metodo per costruire i form studente da associare al form principale.
                              formStudent(x, nome, cognome, sesso, ripetente);
                    }
                    while (righeCursor.moveToNext());
               } else
               {
                    .....
               }
}

private void formStudent(int progressivo, String nome, String cognome, String sesso, String ripetente)
{
        //inserisce il form studente e compilato o meno a seconda s ci sono i dati.

}

}

scrivere un codice errato come quello sopra è semplice. uno che funzioni è un'altra cosa.
quello che vorrei sapere è se l'idea di richiamare XX volte "formStudent" è corrette o se invece è preferibile usare (o deve essere usato ) un'altro metodo.

quello che mi preoccupa è il riconoscimento dei gruppi di form in modo che non si sovrastino (a livello di dati) tra loro.

in html potremmo dire che abbiamo
input text name=id_classe
input text name=descri_classe
---
input text name="1[nome_studente]"
input text name="1[cognome_studente]"

input text name="2[nome_studente]"
input text name="2[cognome_studente]"
..
etc..
« Ultima modifica: 14 Marzo 2013, 11:06:29 CET da daniweb, Reason: salvato erroneamente. »

Offline daniweb

  • Nuovo arrivato
  • *
  • Post: 30
  • Respect: +1
    • Mostra profilo
  • Dispositivo Android:
    galaxy s2
  • Sistema operativo:
    windows 7
Re:leggere il db e costruire il layout dinamicamente.
« Risposta #3 il: 25 Marzo 2013, 18:21:57 CET »
0
sto continuando con il progettino.

alla fine sto scrivendo qualcosa per creare dinamicamente il gli input.
solo che ho un problema con la gestione delle colonne.

in pratica ho una  tabella che contiene 6 righe e 5 colonne.
la seconda riga ha un colspan 2.

non riesco a capire dove sia l'errore.

un aiutino?
Codice (Java): [Seleziona]
public void addNewElement(){
               
                txtRow1 = new TableRow(this);          
                //testo riga 1
                txtR1C1 =new TextView(this); txtR1C1.setText(R.string.textTipoBene); txtR1C1.setWidth(150);
                txtR1C2 =new TextView(this); txtR1C3.setText(""); txtR1C3.setWidth(150);
                txtR1C3 =new TextView(this); txtR1C3.setText(R.string.textVN); txtR1C3.setWidth(150);          
                txtR1C4 =new TextView(this); txtR1C4.setText(R.string.textVA); txtR1C4.setWidth(150);
                txtR1C5 =new TextView(this); txtR1C5.setText(R.string.textVCU); txtR1C5.setWidth(150);         
                txtRow1.addView(txtR1C1);
                txtRow1.addView(txtR1C2);
                txtRow1.addView(txtR1C3);
                txtRow1.addView(txtR1C4);
                txtRow1.addView(txtR1C5);              
                //inserimento riga 1
                editRow1 = new TableRow(this);         
                editR1C1 = new Spinner(this); editR1C1.setMinimumWidth(200); editR1C1.setAdapter(beneAdapter);
               
                TableRow.LayoutParams params = (android.widget.TableRow.LayoutParams) editR1C1.getLayoutParams();
                params.span = 2;
        editR1C1.setId(idEt++);  
                editR1C1.setLayoutParams(params);                      
        editR1C3 = new EditText(this); editR1C3.setText(""); editR1C3.setId(idEt++); editR1C3.setMinLines(1); editR1C3.setMaxLines(1); editR1C3.setWidth(150);
        editR1C4 = new EditText(this); editR1C4.setText(""); editR1C4.setId(idEt++); editR1C4.setMinLines(1); editR1C4.setMaxLines(1); editR1C4.setWidth(150);
        editR1C5 = new EditText(this); editR1C5.setText(""); editR1C5.setId(idEt++); editR1C5.setMinLines(1); editR1C5.setMaxLines(1); editR1C5.setWidth(150);
        editRow1.addView(editR1C1);
        editRow1.addView(editR1C3);
        editRow1.addView(editR1C4);
        editRow1.addView(editR1C5);
       
       
        //testo riga 2
        txtRow2 = new TableRow(this);  
        txtR2C1 =new TextView(this); txtR2C1.setText(R.string.textCosSupCoperta); txtR2C1.setWidth(150);
        txtR2C2 =new TextView(this); txtR2C2.setText(R.string.textMatricolaCliente); txtR2C2.setWidth(150);
        txtR2C3 =new TextView(this); txtR2C3.setText(R.string.textAumentiVN); txtR2C3.setWidth(150);           
        txtR2C4 =new TextView(this); txtR2C4.setText(R.string.textAumentiVA); txtR2C4.setWidth(150);
        txtRow2.addView(txtR2C1);
        txtRow2.addView(txtR2C2);              
        txtRow2.addView(txtR2C3);
        txtRow2.addView(txtR2C4);        
        //inserimento riga 2
        editRow2 = new TableRow(this); 
        editR2C1 = new EditText(this); editR2C1.setText(""); editR2C1.setId(idEt++); editR2C1.setMinLines(1); editR2C1.setMaxLines(1); editR2C1.setWidth(150);
        editR2C2 = new EditText(this); editR2C2.setText(""); editR2C2.setId(idEt++); editR2C2.setMinLines(1); editR2C2.setMaxLines(1); editR2C2.setWidth(150);
        editR2C3 = new EditText(this); editR2C3.setText(""); editR2C3.setId(idEt++); editR2C3.setMinLines(1); editR2C3.setMaxLines(1); editR2C3.setWidth(150);
        editR2C4 = new EditText(this); editR2C4.setText(""); editR2C4.setId(idEt++); editR2C4.setMinLines(1); editR2C4.setMaxLines(1); editR2C4.setWidth(150);
        editRow2.addView(editR2C1);
        editRow2.addView(editR2C2);
        editRow2.addView(editR2C3);
        editRow2.addView(editR2C4);
       
       
       
       
        table.addView(txtRow1);
        table.addView(editRow1);
       
        table.addView(txtRow2);
        table.addView(editRow2);
             
             
        }

Offline daniweb

  • Nuovo arrivato
  • *
  • Post: 30
  • Respect: +1
    • Mostra profilo
  • Dispositivo Android:
    galaxy s2
  • Sistema operativo:
    windows 7
Re:leggere il db e costruire il layout dinamicamente.
« Risposta #4 il: 04 Aprile 2013, 10:07:02 CEST »
0
alla fine ho risolto non usando il colspan, ma aggiungendo una colonna dove necessario, e riducendo la dimensione della prima.