Autore Topic: CursorAdapter  (Letto 594 volte)

Offline Friz02

  • Utente junior
  • **
  • Post: 104
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    s3 neo Samsung
  • Sistema operativo:
    windows 7
CursorAdapter
« il: 06 Gennaio 2015, 20:11:40 CET »
0
Non scrivo tutto il codice, spero si capisca....in sostanza ho precedentemente caricato un database ed in particolar modo nella colonna "figura" ho inserito la stringa "CONE".
In teoria dovrei vedere, nella listView del layout "activity_main_vediprogetti", la stringa CONE di colore CYAN, inveced no....tutto nero.
Ho fatto un piccola verifica e sembra che, all'interno del metodo "bindView", non vengano lette le istruzioni dell'if.

Codice (Java): [Seleziona]
 CursorAdapter cursorAdapter=null;

        cursorAdapter = new CursorAdapter(this, dbManager.getProject(), false) {
            @Override
            public View newView(Context context, Cursor cursor, ViewGroup viewGroup) {
                View v=LayoutInflater.from(context).inflate(R.layout.activity_main_vediprogetti,null);
                return v;
            }

            @Override
            public void bindView(View view, Context context, Cursor cursor) {

                TextView txtFigura = (TextView) view.findViewById(R.id.figura);
                TextView txtTitolo = (TextView) view.findViewById(R.id.titolo);
                TextView txtFormule = (TextView) view.findViewById(R.id.formule);
                TextView txtRaggio = (TextView) view.findViewById(R.id.raggio);
                TextView txtAltezza = (TextView) view.findViewById(R.id.altezza);
                TextView txtVolume = (TextView) view.findViewById(R.id.volume);
                TextView txtSuperficie = (TextView) view.findViewById(R.id.superficie);

                //faccio un verifica
                String verifica = cursor.getString(cursor.getColumnIndex("figura"));
                Log.d("verifica", verifica);              

                txtFigura.setText(cursor.getString(cursor.getColumnIndex("figura")));
 
               //vorrei che la textFigura venisse stampata di color diverso in base alla stringa trovata nel database              
                if (cursor.getString(cursor.getColumnIndex("figura"))=="CONE")
                   {  
                       txtFigura.setTextColor(Color.CYAN);
                       Log.d("verifica", "non lo legge");
                   }
                else if (cursor.getString(cursor.getColumnIndex("figura"))=="SPHERE")
                   {
                       txtFigura.setTextColor(Color.YELLOW);
                       Log.d("verifica", "non lo legge");
                   }
                else if (cursor.getString(cursor.getColumnIndex("figura"))=="PRISM")
                   {
                        txtFigura.setTextColor(Color.GREEN);
                        Log.d("verifica", "non lo legge");
                   }
                else if (cursor.getString(cursor.getColumnIndex("figura"))=="CYLINDER")
                   {
                        txtFigura.setTextColor(Color.MAGENTA);
                        Log.d("verifica", "non lo legge");
                    }
                else
                    {
                         Log.d("verifica", "non lo legge");
                     }

                txtTitolo.setText(cursor.getString(cursor.getColumnIndex("name")));
                txtFormule.setText("Formulas: "+cursor.getString(cursor.getColumnIndex("formule")));
                txtRaggio.setText("Radius: "+cursor.getString(cursor.getColumnIndex("raggio")));
                txtAltezza.setText("Height: "+cursor.getString(cursor.getColumnIndex("altezza")));
                txtVolume.setText("VOLUME: "+cursor.getString(cursor.getColumnIndex("volume")));
                txtSuperficie.setText("SURFACE: "+cursor.getString(cursor.getColumnIndex("superficie")));
            }
        };

        ListView listView = (ListView)findViewById(R.id.listViewSave);
        listView.setAdapter(cursorAdapter);

L'output del Log.d è:
01-06 19:08:22.496  23967-23967/? D/verifica﹕ CONE
01-06 19:08:22.496  23967-23967/? D/verifica﹕ lo legge
01-06 19:08:22.688  23967-23967/? D/verifica﹕ CONE
01-06 19:08:22.692  23967-23967/? D/verifica﹕ lo legge
01-06 19:08:22.712  23967-23967/? D/verifica﹕ CONE
01-06 19:08:22.716  23967-23967/? D/verifica﹕ lo legge
01-06 19:08:24.752  23967-23967/? D/verifica﹕ CONE
01-06 19:08:24.752  23967-23967/? D/verifica﹕ lo legge

Non capisco perchè non esegue l'istruzione
Codice (Java): [Seleziona]
if (cursor.getString(cursor.getColumnIndex("figura"))=="CONE")
                   {  
                       txtFigura.setTextColor(Color.CYAN);
                       Log.d("verifica", "non lo legge");
                   }
e perchè stampa le stesse cose per 4 volte.

Offline GabMarioPower

  • Moderatore globale
  • Utente senior
  • *****
  • Post: 606
  • Respect: +152
    • Github
    • Google+
    • gabrielemariotti
    • GabMarioPower
    • Mostra profilo
  • Play Store ID:
    GAB+MARIO+DEV
  • Sistema operativo:
    Ubuntu 14.04 , Win 10
Re:CursorAdapter
« Risposta #1 il: 06 Gennaio 2015, 20:22:06 CET »
0
Le stringhe in java sono degli oggetti.
Devi usare il metodo equals:

Codice (Java): [Seleziona]
if (cursor.getString(cursor.getColumnIndex("figura")).equals("CONE"))

Offline Friz02

  • Utente junior
  • **
  • Post: 104
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    s3 neo Samsung
  • Sistema operativo:
    windows 7
Re:CursorAdapter
« Risposta #2 il: 06 Gennaio 2015, 21:27:28 CET »
0
 Vero!!....grazie....ma perchè stampa 4 volte le stesse cose?
Il Cursor dovrebbe verificare ogni riga della tabella, nel mio caso ho una sola riga quindi dovrebbe fare "un solo giro" e quindi stampare una sola volta (il Log intendo).

Offline GabMarioPower

  • Moderatore globale
  • Utente senior
  • *****
  • Post: 606
  • Respect: +152
    • Github
    • Google+
    • gabrielemariotti
    • GabMarioPower
    • Mostra profilo
  • Play Store ID:
    GAB+MARIO+DEV
  • Sistema operativo:
    Ubuntu 14.04 , Win 10
Re:CursorAdapter
« Risposta #3 il: 07 Gennaio 2015, 01:06:46 CET »
0
Questo non te lo so dire.
Puoi postare il layout usato e come lo dichiari l'adapter nella tua Activity/Fragment?

Offline Friz02

  • Utente junior
  • **
  • Post: 104
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    s3 neo Samsung
  • Sistema operativo:
    windows 7
Re:CursorAdapter
« Risposta #4 il: 07 Gennaio 2015, 19:12:22 CET »
0
Il layout usato nell'adapater è "activity_main_vediprogetti.xml":
Codice (XML): [Seleziona]
<?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
   android:orientation="vertical"
   android:layout_width="match_parent"
   android:layout_height="match_parent"
   android:background="@android:drawable/alert_light_frame">

    <TextView
       android:layout_width="wrap_content"
       android:layout_height="wrap_content"
       android:textSize="17dp"
       android:textStyle="bold|italic"
       android:text=""
       android:id="@+id/figura"/>

    <TextView
       android:layout_width="wrap_content"
       android:layout_height="wrap_content"
       android:textSize="15dp"
       android:textStyle="normal"
       android:text=""
       android:id="@+id/titolo"/>

    <TextView
       android:layout_width="wrap_content"
       android:layout_height="wrap_content"
       android:textSize="12dp"
       android:textStyle="normal"
       android:text=""
       android:id="@+id/formule"/>

    <TextView
       android:layout_width="wrap_content"
       android:layout_height="wrap_content"
       android:textSize="12dp"
       android:textStyle="normal"
       android:text=""
       android:id="@+id/raggio"/>

    <TextView
       android:layout_width="wrap_content"
       android:layout_height="wrap_content"
       android:textSize="12dp"
       android:textStyle="normal"
       android:text=""
       android:id="@+id/altezza"/>

    <TextView
       android:layout_width="wrap_content"
       android:layout_height="wrap_content"
       android:textSize="12dp"
       android:textStyle="normal"
       android:text=""
       android:id="@+id/volume"/>

    <TextView
       android:layout_width="wrap_content"
       android:layout_height="wrap_content"
       android:textSize="12dp"
       android:textStyle="normal"
       android:text=""
       android:id="@+id/superficie"/>

</LinearLayout>

Mentre quello dell'activity con la listView è "activity_main_savedeproject.xml":
Codice (XML): [Seleziona]
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
   xmlns:tools="http://schemas.android.com/tools"
   tools:context="com.corso_android.myapp2.helloworld.MainActivitySavedProject"
   android:orientation="vertical"
   android:layout_width="wrap_content"
   android:layout_height="wrap_content"
   android:id="@+id/layout_listViewSave">

    <ListView
       android:layout_width="match_parent"
       android:layout_height="wrap_content"
       android:id="@+id/listViewSave"
       android:padding="5dp"
       android:dividerHeight="1dp"
       android:divider="@drawable/shape_stroke_listview"/>|
</LinearLayout>

L'activity (che avevo in parte gia postato) è "MainActivitySavedProject"....non la scrivo tutta, tralascio la parte finale che serve a recuperare dei dati e a caricare il database:
Codice (Java): [Seleziona]
public class MainActivitySavedProject extends ActionBarActivity {

    //SBLOCCO PASSKEY PER CICLO IF
    private static int PASSKEY = 0;
     public class Key
    {
        public Key()
        {
            PASSKEY=1;
        }
    }
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        getActionBar().setDisplayHomeAsUpEnabled(true);
        setContentView(R.layout.activity_main_savedeproject);

        DbManager dbManager = null;
        dbManager = new DbManager(this);
        CursorAdapter cursorAdapter=null;

        cursorAdapter = new CursorAdapter(this, dbManager.getProject(), false) {
            @Override
            public View newView(Context context, Cursor cursor, ViewGroup viewGroup) {
                View v=LayoutInflater.from(context).inflate(R.layout.activity_main_vediprogetti,null);
                return v;
            }
            @Override
            public void bindView(View view, Context context, Cursor cursor) {
                TextView txtFigura = (TextView) view.findViewById(R.id.figura);
                TextView txtTitolo = (TextView) view.findViewById(R.id.titolo);
                TextView txtFormule = (TextView) view.findViewById(R.id.formule);
                TextView txtRaggio = (TextView) view.findViewById(R.id.raggio);
                TextView txtAltezza = (TextView) view.findViewById(R.id.altezza);
                TextView txtVolume = (TextView) view.findViewById(R.id.volume);
                TextView txtSuperficie = (TextView) view.findViewById(R.id.superficie);

                String verifica = cursor.getString(cursor.getColumnIndex("figura"));
                Log.d("verifica", verifica);
                //Log.d("verifica", "ciao");

                txtFigura.setText(cursor.getString(cursor.getColumnIndex("figura")));
                txtFigura.setTextColor(Color.CYAN);
                if (cursor.getString(cursor.getColumnIndex("figura")).equals("CONE"))
                   {txtFigura.setTextColor(Color.CYAN);
                       Log.d("verifica", "non lo legge");}
                else if (cursor.getString(cursor.getColumnIndex("figura")).equals("SPHERE"))
                   {txtFigura.setTextColor(Color.YELLOW);
                       Log.d("verifica", "non lo legge");}
                else if (cursor.getString(cursor.getColumnIndex("figura")).equals("PRISM"))
                   {txtFigura.setTextColor(Color.GREEN);
                       Log.d("verifica", "non lo legge");}
                else if (cursor.getString(cursor.getColumnIndex("figura")).equals("CYLINDER"))
                   {txtFigura.setTextColor(Color.MAGENTA);
                       Log.d("verifica", "non lo legge");}
                else {Log.d("verifica", "lo legge");}

                txtTitolo.setText(cursor.getString(cursor.getColumnIndex("name")));
                txtFormule.setText("Formulas: "+cursor.getString(cursor.getColumnIndex("formule")));
                txtRaggio.setText("Radius: "+cursor.getString(cursor.getColumnIndex("raggio")));
                txtAltezza.setText("Height: "+cursor.getString(cursor.getColumnIndex("altezza")));
                txtVolume.setText("VOLUME: "+cursor.getString(cursor.getColumnIndex("volume")));
                txtSuperficie.setText("SURFACE: "+cursor.getString(cursor.getColumnIndex("superficie")));
            }
        };
        ListView listView = (ListView)findViewById(R.id.listViewSave);
        listView.setAdapter(cursorAdapter);

Offline GabMarioPower

  • Moderatore globale
  • Utente senior
  • *****
  • Post: 606
  • Respect: +152
    • Github
    • Google+
    • gabrielemariotti
    • GabMarioPower
    • Mostra profilo
  • Play Store ID:
    GAB+MARIO+DEV
  • Sistema operativo:
    Ubuntu 14.04 , Win 10
Re:CursorAdapter
« Risposta #5 il: 07 Gennaio 2015, 21:10:07 CET »
0
Prova a cambiare questo android:layout_height="wrap_content" nella tua ListView.

Offline Friz02

  • Utente junior
  • **
  • Post: 104
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    s3 neo Samsung
  • Sistema operativo:
    windows 7
Re:CursorAdapter
« Risposta #6 il: 08 Gennaio 2015, 19:28:06 CET »
0
In effetti con l'altezza della ListView cambia anche il numero di volte che stampa.
Per farlo stampare una sola volta devo mettere un valore fisso tipo 200 o 3000, ecc...dp, però la listview non scorre più.
Mettendo invece match parent o wrap content, stampa uno sproposito di volte....mahh.
Quello che capisco è che il metodo bindView viene invocato più volte in base, appunto, al valore di android:layout_height="....."...mistero.

Offline GabMarioPower

  • Moderatore globale
  • Utente senior
  • *****
  • Post: 606
  • Respect: +152
    • Github
    • Google+
    • gabrielemariotti
    • GabMarioPower
    • Mostra profilo
  • Play Store ID:
    GAB+MARIO+DEV
  • Sistema operativo:
    Ubuntu 14.04 , Win 10
Re:CursorAdapter
« Risposta #7 il: 09 Gennaio 2015, 21:12:04 CET »
0
In effetti con l'altezza della ListView cambia anche il numero di volte che stampa.
Per farlo stampare una sola volta devo mettere un valore fisso tipo 200 o 3000, ecc...dp, però la listview non scorre più.
Mettendo invece match parent o wrap content, stampa uno sproposito di volte....mahh.
Quello che capisco è che il metodo bindView viene invocato più volte in base, appunto, al valore di android:layout_height="....."...mistero.

Allora.
Se usi wrap_content è normale che sia cosi.
E' sbagliato usare wrap_content sulle liste. La lista non conosce quando spazio occuperà, e per farlo è costretta a ciclare sugli item (un numero di volte non predicibile, ma cmq non 1). Questo influisce negativamente sulle performance.

Quello che devi fare è mettere un match_parent, ma lo devi mettere anche al layout che contiene la lista.
In questo caso, lui dovrebbe ciclare 1 sola volta.

Offline Friz02

  • Utente junior
  • **
  • Post: 104
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    s3 neo Samsung
  • Sistema operativo:
    windows 7
Re:CursorAdapter
« Risposta #8 il: 10 Gennaio 2015, 19:13:35 CET »
0
Più o meno...in realtà adesso, con match parent in entremabi i posti, ogni volta che scorro la listview inizia a ristampare.
Comunque il concetto è chiaro...grazie.

Offline GabMarioPower

  • Moderatore globale
  • Utente senior
  • *****
  • Post: 606
  • Respect: +152
    • Github
    • Google+
    • gabrielemariotti
    • GabMarioPower
    • Mostra profilo
  • Play Store ID:
    GAB+MARIO+DEV
  • Sistema operativo:
    Ubuntu 14.04 , Win 10
Re:CursorAdapter
« Risposta #9 il: 10 Gennaio 2015, 21:08:34 CET »
0
Più o meno...in realtà adesso, con match parent in entremabi i posti, ogni volta che scorro la listview inizia a ristampare.
Comunque il concetto è chiaro...grazie.

Scorrendo la listView, scorre l'adapter... è assolutamente normale.