Autore Topic: Piccolo problema logico nella gestione dei preferiti in una lista  (Letto 411 volte)

Offline ValerioAdo

  • Utente normale
  • ***
  • Post: 323
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Huawei Ascend g525
  • Sistema operativo:
    windows 8.1
0
Salve a tutti!

So che probabilmente non dovrei neanche porre la domanda ma è tutta mattina che mi sto scontrando con un problema logico sulla gestione dei preferiti in una lista...

Ogni tanto capita che se tolgo più di un elemento dai preferiti me ne conti solo uno invece che 2/3.... e questo succede anche per quanto riguarda l'aggiunta...

Il problema più grande è che questa lista non ha al suo interno sempre gli stessi elementi, magari l'utente mette come preferito un elemento "a" e dopo qualche giorno questo elemento "a" non è presente nella lista per poi tornare presente in un secondo/terzo momento...

Questo è il codice che uso per gestire i preferiti all'interno del mio adapter:
Codice (Java): [Seleziona]
  final String List = settings.getString("PLAYLISTS", "");

        final String[] Favorites = List.split(",");


        //holder.pref.setTag(android.R.drawable.btn_star_big_off);

        for(int i=0;i<Favorites.length;i++){
            if (Name[position].equals(Favorites[i])) {
                holder.pref.setImageResource(android.R.drawable.btn_star_big_on);
                holder.pref.setTag(android.R.drawable.btn_star_big_on);
                entered=1;
            }
        }
        if(entered==0){
            holder.pref.setImageResource(android.R.drawable.btn_star_big_off);
            holder.pref.setTag(android.R.drawable.btn_star_big_off);
        }


        holder.pref.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                SharedPreferences.Editor editor = settings.edit();

                int drawableId = (Integer) holder.pref.getTag();

                if (drawableId == android.R.drawable.btn_star_big_off) {
                    int entered=0;
                    holder.pref.setImageResource(android.R.drawable.btn_star_big_on);
                    holder.pref.setTag(android.R.drawable.btn_star_big_on);

                    String app[]={""};

                    if(Favorites.length>=1) {
                        app = new String[Favorites.length + 1];//creo un array stringhe di appoggio lunga uno in più della lista di preferiti
                    }

                    for(int d=0;d<app.length;d++){
                        app[d]="";
                    }

                    for(int c=0;c<Favorites.length;c++){//copio i prefereriti nell'appoggio
                        if(!Favorites[c].isEmpty()) {
                            app[c] = Favorites[c];
                        }
                    }

                    for(int i=0;i<app.length;i++){//inserisco il nuovo preferito nel primo spazio libero che trovo
                        if(app[i].isEmpty()) {
                            if (entered == 0) {
                                app[i] = Name[position];
                                entered = 1;
                            }
                        }
                    }

                     StringBuilder sb = new StringBuilder();
                    for (int i = 0; i < app.length; i++) {//costruisco la stringa da inserire nei preferiti c
                        sb.append(app[i]).append(",");
                    }

                    editor.putString("PLAYLISTS", sb.toString());
                    editor.commit();

                    Toast.makeText(mcontext,Name[position]+" aggiunto ai preferiti",Toast.LENGTH_LONG).show();
                } else {
                    holder.pref.setImageResource(android.R.drawable.btn_star_big_off);
                    holder.pref.setTag(android.R.drawable.btn_star_big_off);

                    for(int i=0;i<Favorites.length;i++){
                        if(Name[position].equals(Favorites[i])){
                                    Favorites[i] = "";
                        }
                    }

                    StringBuilder sb = new StringBuilder();
                    for (int i = 0; i < Favorites.length; i++) {
                        if(!Favorites[i].isEmpty()) {
                            sb.append(Favorites[i]).append(",");
                        }
                    }
                    editor.putString("PLAYLISTS", sb.toString());
                    editor.commit();

                    Toast.makeText(mcontext,Name[position]+" eliminato dai preferiti",Toast.LENGTH_LONG).show();
                }
            }
        });

        holder.Name.setText(Name[position]);

So che magari usare lo SharedPreference non è la scelta migliore ma al momento mi sembra la via più facile da modificare se un giorno vorrò cambiare criteri o altro....

Avete qualche suggerimento?

Grazie mille in anticipo per l'aiuto!

Offline LonelyWolf

  • Utente junior
  • **
  • Post: 148
  • Respect: +12
    • Mostra profilo
    • Traversate dei laghi
  • Dispositivo Android:
    GT-I9505, ALE-L21
  • Sistema operativo:
    Windows 7 32/64
Re:Piccolo problema logico nella gestione dei preferiti in una lista
« Risposta #1 il: 01 Dicembre 2015, 12:29:50 CET »
+1
Usare un database sqlite ti risparmia un bel po' di problemi.
Aggiunta senza dover cercare lo spazio vuoto e quindi senza dover ricreare l'array per avere un nuovo spazio vuoto, rimozione rapida, conteggio corretto in base alle selezioni, in più puoi anche già prevedere liste preferite differenti.
Se la mia risposta ti è utile, per favore un thanks!

Offline ValerioAdo

  • Utente normale
  • ***
  • Post: 323
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Huawei Ascend g525
  • Sistema operativo:
    windows 8.1
Re:Piccolo problema logico nella gestione dei preferiti in una lista
« Risposta #2 il: 01 Dicembre 2015, 15:12:46 CET »
0
Ok, passo al dblite.
Unica cosa.... nell'apertura del db (che faccio all'interno dell'adapter) mi da un problema sul secondo parametro di openOrCreateDatabase, normalmente io lo creo così:
Codice (Java): [Seleziona]
            db = SQLiteDatabase.openOrCreateDatabase("Preferenze",Context.MODE_PRIVATE,null);
però mi da errore sul secondo parametro dicendomi:
'Wrong 2nd argument type. Found: 'int', required: 'android.database.sqlite.SQLiteDatabase.CursorFactory'

probabilmente la scelta migliore sarebbe aprire il database una volta fuori dall'app e finita lì.... però mi piacerebbe comunque sapere il perché di questo errore

Offline LonelyWolf

  • Utente junior
  • **
  • Post: 148
  • Respect: +12
    • Mostra profilo
    • Traversate dei laghi
  • Dispositivo Android:
    GT-I9505, ALE-L21
  • Sistema operativo:
    Windows 7 32/64
Re:Piccolo problema logico nella gestione dei preferiti in una lista
« Risposta #3 il: 01 Dicembre 2015, 15:42:18 CET »
0
Perchè la chiamata prevede questo:

Codice: [Seleziona]
openOrCreateDatabase(String path, SQLiteDatabase.CursorFactory factory)
Io di solito uso un "helper" per il database così dove mi serve lo richiamo semplicemente

Codice: [Seleziona]
db = dbHelper.getWritableDatabase();
Se la mia risposta ti è utile, per favore un thanks!

Offline ValerioAdo

  • Utente normale
  • ***
  • Post: 323
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Huawei Ascend g525
  • Sistema operativo:
    windows 8.1
Re:Piccolo problema logico nella gestione dei preferiti in una lista
« Risposta #4 il: 01 Dicembre 2015, 15:56:16 CET »
0
Ok ho capito, grazie mille!