Autore Topic: Visualizzazione anomala dei dati di un database nella listview.  (Letto 735 volte)

Offline tank

  • Nuovo arrivato
  • *
  • Post: 23
  • Respect: 0
    • Mostra profilo
Visualizzazione anomala dei dati di un database nella listview.
« il: 20 Ottobre 2012, 20:44:31 CEST »
0
Salve! Ho un problema nella visualizzazione dei dati di un database nella sua listview: in pratica, ogni riga occupa tutto lo schermo, e bisogna scorrere verso il basso per visualizzare le righe successive del database.
Utilizzo SDK progetto e dispositivo = 10.
Premetto che il mio database è tutto basato sul tutorial di Qlimax, con le opportune modifiche per quel che mi serve. Il database ha i seguenti campi: id, albergo, indirizzo, accessibilità...nella listview voglio visualizzare soltanto albergo, indirizzo e accessibilità.

Vi posto i codici:
Classe del database.
Codice (Java): [Seleziona]
package com.example.provadatabase;

import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteDatabase.CursorFactory;
import android.database.sqlite.SQLiteOpenHelper;

public class Database {
        SQLiteDatabase mDb;
    DbHelper mDbHelper;
    Context mContext;
    private static final String DB_NAME="tutorialdb";//nome del db
    private static final int DB_VERSION=1; //numero di versione del nostro db
   
    public Database(Context ctx){
            mContext=ctx;
            mDbHelper=new DbHelper(ctx, DB_NAME, null, DB_VERSION);    
    }
   
    public void open(){  //il database su cui agiamo è leggibile/scrivibile
            mDb=mDbHelper.getWritableDatabase();
           
    }
   
    public void close(){ //chiudiamo il database su cui agiamo
            mDb.close();
    }
   
   
    //i seguenti 2 metodi servono per la lettura/scrittura del db. aggiungete e modificate a discrezione
   // consiglio:si potrebbe creare una classe Prodotto, i quali oggetti verrebbero passati come parametri dei seguenti metodi, rispettivamente ritornati. Lacio a voi il divertimento

   
    public void insertProduct(String nome, String indirizzo, String accessibilita){ //metodo per inserire i dati
            ContentValues cv=new ContentValues();
            cv.put(ProductsMetaData.PRODUCT_NOME_KEY, nome);
            cv.put(ProductsMetaData.PRODUCT_INDIRIZZO_KEY, indirizzo);
            cv.put(ProductsMetaData.PRODUCT_ACCESSIBILITA_KEY, accessibilita);
            mDb.insert(ProductsMetaData.PRODUCTS_TABLE, null, cv);
    }
   
    public Cursor fetchProducts(){ //metodo per fare la query di tutti i dati
            return mDb.query(ProductsMetaData.PRODUCTS_TABLE, null,null,null,null,null,null);              
    }
   
    public Cursor fetchAccessibilita(){ //metodo per fare la query dei dati accessibilità=si
        return mDb.query(ProductsMetaData.PRODUCTS_TABLE, null,ProductsMetaData.PRODUCT_ACCESSIBILITA_KEY + "= 'Si'",null,null,null,null);              
}
   
    public Cursor fetchAccessibilita(String value){ //metodo per fare la query dei dati accessibilità=value
        return mDb.query(ProductsMetaData.PRODUCTS_TABLE, null,ProductsMetaData.PRODUCT_ACCESSIBILITA_KEY + "= '"+value+"'",null,null,null,null);              
}

    static class ProductsMetaData {  // i metadati della tabella, accessibili ovunque
            static final String PRODUCTS_TABLE = "luoghiaccessibili";
            static final String ID = "_id";
            static final String PRODUCT_NOME_KEY = "nome";
            static final String PRODUCT_INDIRIZZO_KEY = "indirizzo";
            static final String PRODUCT_ACCESSIBILITA_KEY = "accessibilita";
    }

    private static final String PRODUCTS_TABLE_CREATE = "CREATE TABLE IF NOT EXISTS "  //codice sql di creazione della tabella
                    + ProductsMetaData.PRODUCTS_TABLE + " ("
                    + ProductsMetaData.ID+ " integer primary key autoincrement, "
                    + ProductsMetaData.PRODUCT_NOME_KEY + " text not null, "
                    + ProductsMetaData.PRODUCT_INDIRIZZO_KEY + " text not null, "
                                + ProductsMetaData.PRODUCT_ACCESSIBILITA_KEY + " text not null);";

    private class DbHelper extends SQLiteOpenHelper { //classe che ci aiuta nella creazione del db

            public DbHelper(Context context, String name, CursorFactory factory,int version) {
                    super(context, name, factory, version);
            }



                        @Override
            public void onCreate(SQLiteDatabase _db) { //solo quando il db viene creato, creiamo la tabella
                    _db.execSQL(PRODUCTS_TABLE_CREATE);
                   
            }

            @Override
            public void onUpgrade(SQLiteDatabase _db, int oldVersion, int newVersion) {
                    //qui mettiamo eventuali modifiche al db, se nella nostra nuova versione della app, il db cambia numero di versione

            }

    }
           

}

Activity che usa il database.
Codice (Java): [Seleziona]
package com.example.provadatabase;

import android.app.Activity;
import android.database.Cursor;
import android.graphics.Color;
import android.graphics.PixelFormat;
import android.graphics.drawable.GradientDrawable;
import android.os.Bundle;
import android.support.v4.widget.SimpleCursorAdapter;
import android.util.Log;
import android.view.WindowManager;
import android.view.animation.Animation;
import android.view.animation.AnimationUtils;
import android.view.animation.TranslateAnimation;
import android.widget.ListView;

public class Luoghiaccessibili extends Activity {
        @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.turismonegozi);                
       
       
       
        ListView listaluoghi=(ListView)findViewById(R.id.listaluoghi);
       
        Database db=new Database(getApplicationContext());
        db.open();  //apriamo il db
       
       
      if(db.fetchProducts().getCount()==0){//inserimento dati, solo se il db è vuoto
       
                db.insertProduct("Admiral", "Via Domodossola, 16", "Accompagnato");
                db.insertProduct("Albert", "Via Tonale, 2", "Si");
                db.insertProduct("Alexander", "Via Napo Torriani, 9", "Accompagnato");
                db.insertProduct("Aliseo", "Corso Italia, 6", "No");
        }
       
       

      //Cursor c=db.fetchProducts(); // query
      Cursor c=db.fetchAccessibilita("Accompagnato"); // query
        startManagingCursor(c);

       
       
        SimpleCursorAdapter adapter=new SimpleCursorAdapter( //semplice adapter per i cursor
                        this,
                        R.layout.turismonegozi_riga, //il layout di ogni riga
                        c,
                        new String[]{Database.ProductsMetaData.PRODUCT_NOME_KEY,Database.ProductsMetaData.PRODUCT_INDIRIZZO_KEY,Database.ProductsMetaData.PRODUCT_ACCESSIBILITA_KEY},//questi colonne
                        new int[]{R.id.nome,R.id.indirizzo,R.id.accessibilita});//in queste views
       
       

       
       
        listaluoghi.setAdapter(adapter); //la listview ha questo adapter
       
       
        //qui vediamo invece come reperire i dati e usarli, in questo caso li stampiamo in una textview
       
        int nomeCol=c.getColumnIndex(Database.ProductsMetaData.PRODUCT_NOME_KEY);  //indici delle colonne
        int indirizzoCol=c.getColumnIndex(Database.ProductsMetaData.PRODUCT_INDIRIZZO_KEY);
        int accessibilitaCol=c.getColumnIndex(Database.ProductsMetaData.PRODUCT_ACCESSIBILITA_KEY);
       
        if(c.moveToFirst()){  //se va alla prima entry, il cursore non è vuoto
                do {
                        //Log.d("DATABASE", c.getString(nomeCol));
   
                        //listaluoghi.append("Product Nome:"+c.getString(nomeCol)+", Indirizzo:"+c.getString(indirizzoCol)+", Accessibilita:"+c.getString(accessibilitaCol));
                                       
                        } while (c.moveToNext());//iteriamo al prossimo elemento
        }
       
        db.close();
       
    }
}

Il layout per la listview del database.
Codice (XML): [Seleziona]
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
   android:layout_width="fill_parent"
   android:layout_height="wrap_content"
   android:background="@drawable/senzabarrierelist"
   android:orientation="vertical" >

        <ListView
               android:id="@+id/listaluoghi"
               android:layout_width="fill_parent"
               android:layout_height="wrap_content"
               android:cacheColorHint="#00000000"
               android:dividerHeight="2dp"
               android:divider="@drawable/divider"
             
       ></ListView>
</LinearLayout>

Il layout di ogni elemento della listview.
Codice (XML): [Seleziona]
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
   android:id="@+id/LinearLayout2"
   android:layout_width="wrap_content"
   android:layout_height="wrap_content"
   android:background="@drawable/senzabarrierelist"
   android:orientation="horizontal"
   android:weightSum="10" >

    <TextView
       android:id="@+id/nome"
       android:layout_width="0dp"
               android:layout_height="wrap_content"
               android:layout_weight="3"
       android:text="nome" />

    <TextView
       android:id="@+id/indirizzo"
       android:layout_width="0dp"
               android:layout_height="wrap_content"
               android:layout_weight="4"
       android:text="indirizzo" />

    <TextView
       android:id="@+id/accessibilita"
       android:layout_width="0dp"
               android:layout_height="wrap_content"
               android:layout_weight="3"
       android:text="accessibilità" />

</LinearLayout>

Come posso risolvere? .__.
« Ultima modifica: 20 Ottobre 2012, 20:49:02 CEST da tank, Reason: Errore di battitura. »

Offline blackgin

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 1387
  • Respect: +164
    • Google+
    • blackgins
    • blackginsoft
    • Mostra profilo
  • Dispositivo Android:
    Galaxy Nexus
  • Sistema operativo:
    Mac OSX 10.8
Re:Visualizzazione anomala dei dati di un database nella listview.
« Risposta #1 il: 20 Ottobre 2012, 21:15:50 CEST »
0
Puoi postare uno screen del problema? Non vedo errori nel layout
Postate il LogCat LogCat LogCat LogCat LogCat

Offline tank

  • Nuovo arrivato
  • *
  • Post: 23
  • Respect: 0
    • Mostra profilo
Re:Visualizzazione anomala dei dati di un database nella listview.
« Risposta #2 il: 20 Ottobre 2012, 23:49:42 CEST »
0
Eeeehm, problema risolto :D in pratica avevo impostato un background anche nel layout che contiene i singoli elementi della listview, per far visualizzare tutto il background mi espandeva appunto ogni riga della listview a tutto schermo! È bastato eliminare la riga:
Codice (Java): [Seleziona]
android:background="@drawable/senzabarrierelist"ed ora è tutto ok! :-P

Grazie comunque per l'aiuto! :-)