ScharedPreferences wie gehe ich damit um??

  • Antworten:94
  • Bentwortet
Antonio P.
  • Forum-Beiträge: 113

04.02.2015, 15:29:24 via Website

Ich werde mich mal schlau machen und melde mich wieder.

Antworten
Antonio P.
  • Forum-Beiträge: 113

04.02.2015, 17:38:04 via Website

So weit habe ich es verstanden mit dem Serialisieren von Objects.
Diese werden in einer Datei .ser als Bytesequenz gespeichert (serialisiert), diese kann ich dann wieder deserialisieren das heißt wieder auslesen.

Das Serialisieren habe ich mir vorgestellt in der Klasse ColorManager zu implementieren.

public void serializeMap(ColorManager colManager) {
try {
    FileOutputStream fileOut= openFileOutput(namefile.bin, Context.MODE_PRIVATE) ;
    ObjectOutputStream out = new ObjectOutputStream(fStream);

    out.writeObject(colManager);        
    out.flush();
    out.close();

} catch (Exception e) {

}

}

Wie würde dann das deserialisieren aussehen. Wenn die Serialisierung so okay ist

Danke schonmal :)

— geändert am 04.02.2015, 17:38:42

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

04.02.2015, 18:03:25 via Website

Das Serialisierten sieht schonmal gut aus :)
Da musst du dir dann mal schaen ob es so funktioniert vlt fehlt dir ein Serializable interface oder die public variablen.

Deserialisieren:

FileInputStream fis = context.openFileInput(fileName);
ObjectInputStream is = new ObjectInputStream(fis);
ColorManager colMan= (ColorManager) is.readObject();
is.close();
fis.close();
return colMan;

LG Pascal //It's not a bug, it's a feature. :) ;)

Antworten
Antonio P.
  • Forum-Beiträge: 113

05.02.2015, 12:59:58 via Website

So habe es nun versucht aber es klappt nicht ganz mit dem Aufstellen der Methoden. Es sieht so weit so aus

public class ColorManager implements Serializable { 
//Hier stehen alle anderen Methoden der Klasse ColorManager


public void serializeMap(ColorManager colManager) {
    try {
        FileOutputStream fileOut= openFileOutput(namefile.bin, Context.MODE_PRIVATE) ;  
        //openFileOutput wird nicht als Methode erkannt. Gibt es sie?  Wie/Wo stelle ich so eine namefile.bin her/hin?

        ObjectOutputStream out = new ObjectOutputStream(fileOut);
        out.writeObject(colManager);
        out.flush();
        out.close();

    } catch (Exception e) {

    }
}

//Diese Methode wird mir auch falsch angezeigt. Wahrscheinlich weil es die Datei namefile.bin nicht existiert

 public void deserializeMap(ColorManager colorManager)
    {
        FileInputStream fis = context.openFileInput(namefile);    
        ObjectInputStream is = new ObjectInputStream(fis);
        ColorManager colMan= (ColorManager) is.readObject();
        is.close();
        fis.close();
        return colMan;
    }}

Wie gehe ich am Besten vor? Bzw was brauche ich noch?

Vielen Dank im Voraus

Antworten
Sven R.
  • Forum-Beiträge: 1.904

05.02.2015, 16:26:44 via App

Wenn die Methode als "falsch" angezeigt wird, wird es ja eine Fehlermeldung stehen.

Die deserialize Methode hat void als return Type. Das sollte ColorManger sein.

Ich sage nur: Copy & Paste...

Edit: Den einen Parameter brauchst du auch nicht.

— geändert am 05.02.2015, 16:29:45

Wenn dir mein Beitrag gefällt, kannst dich einfach mit dem 👍 "Danke"-Button auf der Website dieses Forums bedanken. 😀

Why Java? - Because I can't C#

Antworten
Antonio P.
  • Forum-Beiträge: 113

05.02.2015, 17:31:36 via Website

hab die methoden mal abgeändert und folgendes habe ich nun, es werden mir keine Fehler angezeigt aber speichern kann ich die zustände auch nicht

public static String savedState = "savedState.ser";

public void saveToFile(Context context) {
    try {
        FileOutputStream fileOut= context.openFileOutput(savedState, Context.MODE_PRIVATE) ;
        ObjectOutputStream out = new ObjectOutputStream(fileOut);
        out.writeObject(this);
        out.flush();
        out.close();

        System.out.printf("Serialized data is saved in /tmp/employee.ser");

    } catch (Exception e) {
        System.out.printf("ERROR: Serialized data is saved in /tmp/employee.ser");
        e.printStackTrace();
    }
}



public static ColorManager readFromFile(Context context) {
    ColorManager colManager = null;
    try {
        FileInputStream fileInputStream = context.openFileInput(savedState);
        ObjectInputStream objectInputStream = new ObjectInputStream(fileInputStream);
        colManager = (ColorManager ) objectInputStream.readObject();
        objectInputStream.close();
        fileInputStream.close();
    } catch (IOException e) {
        e.printStackTrace();
    }
    catch (ClassNotFoundException e) {
        e.printStackTrace();
    }
    return colManager;
}

In der 3. Activity: rufe ich die Methode saveToFile() in der Methode onBackPressed()
in der 2. Activity: rufe ich die Methode readFromFile() in der Methode onCreate() und onRestart()

Antworten
Sven R.
  • Forum-Beiträge: 1.904

05.02.2015, 17:36:41 via Website

Wie äußert es sich denn, dass du nicht speichern kannst?

Wenn dir mein Beitrag gefällt, kannst dich einfach mit dem 👍 "Danke"-Button auf der Website dieses Forums bedanken. 😀

Why Java? - Because I can't C#

Antworten
Antonio P.
  • Forum-Beiträge: 113

05.02.2015, 17:43:40 via App

Wenn ich die App verlasse oder zur ersten activity navigiere und dann wieder auf die zweite activity gehe dann sind die Zustände alle wieder gelöscht

Antworten
Sven R.
  • Forum-Beiträge: 1.904

05.02.2015, 17:49:16 via Website

Vielleicht funktioniert das Lesen dann nicht. Oder die Darstellung der Daten.

Keine Fehler im LogCat? Sonst debug mal Schritt für Schritt, um die Stelle zu finden, wo es hapert.

Wenn dir mein Beitrag gefällt, kannst dich einfach mit dem 👍 "Danke"-Button auf der Website dieses Forums bedanken. 😀

Why Java? - Because I can't C#

Antworten
Antonio P.
  • Forum-Beiträge: 113

05.02.2015, 17:52:09 via Website

Also im LogCat kommen auch keine Fehler. Ich muss jedoch sagen, dass ich die Iteration durch die GridView nicht mit implementiert habe so dass alle Items durch iteriert werden. Aber zum Testen habe ich es nur mit einem Item versuchen wollen. Leider geht das nicht.

Antworten
Antonio P.
  • Forum-Beiträge: 113

05.02.2015, 17:52:10 via Website

Also im LogCat kommen auch keine Fehler. Ich muss jedoch sagen, dass ich die Iteration durch die GridView nicht mit implementiert habe so dass alle Items durch iteriert werden. Aber zum Testen habe ich es nur mit einem Item versuchen wollen. Leider geht das nicht.

Antworten
Sven R.
  • Forum-Beiträge: 1.904

05.02.2015, 18:03:20 via Website

Dann debug.

Wenn dir mein Beitrag gefällt, kannst dich einfach mit dem 👍 "Danke"-Button auf der Website dieses Forums bedanken. 😀

Why Java? - Because I can't C#

Antworten
Antonio P.
  • Forum-Beiträge: 113

05.02.2015, 21:24:58 via Website

Ich brauche unbedingt Hilfe ich bekomme das einfach nicht hin. Das debuggen hat mich auch nicht weiter gebracht.

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

05.02.2015, 21:29:41 via App

Ich schau mir das nochmal an wenn ich Zeit habe (morgen oder am Wo). Wieso hat dich das debuggen nicht weitergebracht?

Wirs der File gespeichert ?
Kannst du ihn deserialisieren?
Das bekommt man leicht mit dem debugger raus.

LG Pascal //It's not a bug, it's a feature. :) ;)

Antworten
Antonio P.
  • Forum-Beiträge: 113

06.02.2015, 05:43:30 via App

Beim debuggen springt er garnicht in die Methode saveToFile() daher denke ich das irgendwas nicht stimmt. Ich werde es später nochmal versuchen und nochmal berichten

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

06.02.2015, 07:00:07 via App

Wann rufst du diese auf?

LG Pascal //It's not a bug, it's a feature. :) ;)

Antworten
Antonio P.
  • Forum-Beiträge: 113

06.02.2015, 08:55:17 via App

Ich hab es so verstanden. In der dritten activity werden ja die Farben in die HashMap zum jeweiligen GridView Item hinzugefügt. Das heißt ich rufe die Methode saveToFile jedes mal in der onBackPressed() in der letzten Activity auf.

Antworten
Antonio P.
  • Forum-Beiträge: 113

06.02.2015, 10:27:59 via Website

Aktuell sieht es so aus

public class ColorManager implements Serializable {

public static String savedState = "savedState.ser";


///hier kommen alle anderen Methoden der ColorManager Klasse


//Serialisieren
public void saveToFile(Context context) {
    try {
        FileOutputStream fileOutputStream = context.openFileOutput(savedState, Context.MODE_PRIVATE);
        ObjectOutputStream objectOutputStream = new ObjectOutputStream(fileOutputStream);
        objectOutputStream.writeObject(this);
        objectOutputStream.close();
        fileOutputStream.close();
        System.out.printf("Serialized HashMap data is saved in savedState.ser");

    } catch (IOException e) {
        e.printStackTrace();
    }
}


// Deserialisieren
public static ColorManager readFromFile(Context context) {
    ColorManager colorManager= null;
    try {
        FileInputStream fileInputStream = context.openFileInput(savedState);
        ObjectInputStream objectInputStream = new ObjectInputStream(fileInputStream);
        colorManager = (ColorManager) objectInputStream.readObject();
        objectInputStream.close();
        fileInputStream.close();
    } catch (IOException e) {
        e.printStackTrace();
    }
    catch (ClassNotFoundException e) {
        e.printStackTrace();
    }
    return colorManager;
}
}

In Activity 3: In der Methode onBackPressed() rufe ich die Methode saveToFile() auf uzw. so

public class ShowDetailActivity extends Activity implements ActionBar.Tablistener{

public void onBackPressed() {
    super.onBackPressed();
    ColorManager colorManager = ColorManager.getColorManager(listItemPos)
    colorManager.saveToFile(this);
}
}

Er springt dieses mal in die Methode saveToFile() rein aber die Ausgabe sehe ich nicht in meinem LogCat und ein Fehler wird ebenso nicht angezeigt.

In der 2.Avtivity wo alles gespeichert werden soll (also alle Farben) mache ich folgendes.

 @Override
protected void onRestart() {
    super.onRestart();
    ColorManager cm = ColorManager.getColorManager(listItemPos);
    cm = cm.readFromFile(this);

    int itemColor = cm.get(index);
    gridView.getChildAt(index).setBackgroundColor(itemColor);

}

UPDATE:
Ich habe es hinbekommen mit dem Log Eintrag ich sehe die Ausgabe es wird serialisiert und deserialisiert. Nun wird es trotzdem nicht gespeichert/gesetzt in der onRestart() der 2. Activity

— geändert am 06.02.2015, 11:32:28

Antworten
Antonio P.
  • Forum-Beiträge: 113

06.02.2015, 13:00:19 via Website

Es passiert jetzt was ganz komisches.
Beispiel:
2 Activity: Ich klicke das Erste Item --> 3.Activity Ich setzte die Farbe für das angeklickte Item
zurück in die 2.Activity: die Farbe ist gesetzt, wenn ich jetzt runter scrolle färbt sich plötzlich das 20. Item auch ein. Wenn ich nun wieder hochscrolle ist plötzlich das 1. ITEM nicht mehr eingefärbt sondern das 2. Item wenn ich nun wieder runter scrolle dann ist das 19. Item gefärbt.

Ist das ein recycling Problem?

Langsam Verzweifle ich.

BITTE UM HILFE

— geändert am 06.02.2015, 13:02:25

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

06.02.2015, 13:34:14 via Website

Hallo,

Bitte nicht verzweifeln, das ist ganz schlecht. Lieber mal eine pause einlegen und mit neuer Energie in ein Paar Tagen das ganz anschauen. Wenn man etwas anderes dazwischen macht und es sich einige Tage später wieder anschaut kann es sein, dass der Fehler dann ganz offensichtlcih ist.

Wie ist denn dein Code für das GridView?

Vielleicht ist dieser Falsch?
Gibt es irgendwelche komischen LogCat ausgaben?

LG Pascal

LG Pascal //It's not a bug, it's a feature. :) ;)

Antworten
Antonio P.
  • Forum-Beiträge: 113

06.02.2015, 13:42:12 via Website

Hallo Pascal,

danke für den Tipp. Leider bin ich etwas unter Zeitdruck das alles muss spätestens am Donnerstag fertig gestellt sein. :'(

Mein GridView Code sieht so aus:

array = extras.getStringArrayList("aufgabenFiltered");
gridView.setAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, array));

Ich habe keinen extra Adapter implementiert.

Danke nochmal Pascal

EDIT: Im LogCat komm nur ein Fehler wenn ich ein Item auswähle das ich nur durch Scrollen erreichen kann. Dann stürzt die App ab. Im LogCat steht dann folgendes.

 Caused by: java.lang.NullPointerException
        at de.hsesslingen.test_listview_adapter_aufruf.app.DetailActivity.onRestart(DetailActivity.java:90)

— geändert am 06.02.2015, 13:45:41

Antworten
Sven R.
  • Forum-Beiträge: 1.904

06.02.2015, 13:51:46 via App

Was steht denn in der Zeile? Sollte eigentlich selbsterklärend sein, die Zeile mitzuposten 😉

Wenn dir mein Beitrag gefällt, kannst dich einfach mit dem 👍 "Danke"-Button auf der Website dieses Forums bedanken. 😀

Why Java? - Because I can't C#

Antworten
Antonio P.
  • Forum-Beiträge: 113

06.02.2015, 13:55:24 via Website

Sorry.

    @Override
protected void onRestart() {
    super.onRestart();
    ColorManager cm = ColorManager.getColorManager(listItemPos);
    ///cm = cm.readFromFile(this);
    int itemColor = cm.get(index);
    gridView.getChildAt(index).setBackgroundColor(itemColor);     /////////////DAS IST DIE ZEILE

}

— geändert am 06.02.2015, 13:57:50

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

06.02.2015, 14:03:06 via Website

So wie ich das sehe benutzt du den Code falsch

Der ist nicht fürs speichern optimiert.

dafür muss die Klasse geänder werden, damit die Liste der ColorManager auch gepseichert wird

LG Pascal //It's not a bug, it's a feature. :) ;)

Antworten
Antonio P.
  • Forum-Beiträge: 113

06.02.2015, 14:09:26 via Website

Ich speicher die Liste so in der dritten Activity:

    @Override
public void onBackPressed() {
    super.onBackPressed();
    ColorManager colorManager = ColorManager.getColorManager(listItemPos);
    colorManager.saveToFile(this);
}

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

06.02.2015, 14:11:17 via Website

Du speicherst das objektorentiert.
Du musst das ganze statisch machen und alles (auch statische liste) serialisieren und speichern.
Sonst funktioniert die Logik mit speuchern nciht.
Und wenn du lädst dann nur im onResume oder im on Crate.
Speicher dann in onDestroy oder onPause.

LG Pascal //It's not a bug, it's a feature. :) ;)

Antworten
Antonio P.
  • Forum-Beiträge: 113

06.02.2015, 14:20:02 via Website

kannst du mir vielleicht ein beispiel machen

ich hab das so nun versucht geht aber auch nicht

@Override
protected void onPause() {
    super.onPause();
    try {
        FileOutputStream fileOutputStream = context.openFileOutput(savedState, Context.MODE_PRIVATE);    ///////Zeile 242
        ObjectOutputStream objectOutputStream = new ObjectOutputStream(fileOutputStream);
        objectOutputStream.writeObject(this);
        objectOutputStream.close();
        fileOutputStream.close();
        Log.i("ColorManager", "Serialisierung erfolgreich");
    } catch (IOException e) {
        e.printStackTrace();
    }
}

bekomme wieder Fehler:

 Caused by: java.lang.NullPointerException
        at de.hsesslingen.test_listview_adapter_aufruf.app.ShowDetailActivity.onPause(ShowDetailActivity.java:242)

Antworten
Antonio P.
  • Forum-Beiträge: 113

06.02.2015, 16:25:19 via Website

Hat jemand ein Vorschlag? :'(

Antworten
Sven R.
  • Forum-Beiträge: 1.904

06.02.2015, 17:34:00 via App

Irgendwas ist da ja null. Das einzige könnte context sein, was ich aber komisch finde. Keine Ahnung...

Wenn dir mein Beitrag gefällt, kannst dich einfach mit dem 👍 "Danke"-Button auf der Website dieses Forums bedanken. 😀

Why Java? - Because I can't C#

Antworten
Antonio P.
  • Forum-Beiträge: 113

06.02.2015, 18:48:03 via App

Ich komme leider garnicht mehr weiter.

Antworten
Stefan W
  • Forum-Beiträge: 424

06.02.2015, 19:40:55 via App

Ich hab mir jetzt nur die Letzte Fehlermeldung angeschaut, und den Rest mal übersprungen.

Hast du schon überprüft ob context null is ?

Z.b. so (pseudocode)

if : context == null dann Log("hier liegt das problem")

Antworten
Antonio P.
  • Forum-Beiträge: 113

06.02.2015, 20:50:17 via Website

Okay context ist gleich null. Das Problem der GridView, dass diese abstürzt liegt an der Speicherung durch die HashMap. Sind denn meine Serialize und Deserialize Methoden so richtig.

// Serializes an object and saves it to a file
public void saveToFile(Context context) {
    try {
        FileOutputStream fileOutputStream = context.openFileOutput(savedState, Context.MODE_PRIVATE);
        ObjectOutputStream objectOutputStream = new ObjectOutputStream(fileOutputStream);
        objectOutputStream.writeObject(this);
        objectOutputStream.close();
        fileOutputStream.close();
        Log.i("ColorManager", "Serialisierung erfolgreich");
    } catch (IOException e) {
        e.printStackTrace();
    }
}


// Creates an object by reading it from a file
public static ColorManager readFromFile(Context context) {
    ColorManager colorManager= null;
    try {
        FileInputStream fileInputStream = context.openFileInput(savedState);
        ObjectInputStream objectInputStream = new ObjectInputStream(fileInputStream);
        colorManager = (ColorManager) objectInputStream.readObject();
        objectInputStream.close();
        fileInputStream.close();
        Log.i("ColorManager", "Deserialisierung erfolgreich");
    } catch (IOException e) {
        e.printStackTrace();
    }
    catch (ClassNotFoundException e) {
        e.printStackTrace();
    }
    return colorManager;
}

Vielleicht sollte ich nicht Context als Parameter übergeben.

— geändert am 06.02.2015, 20:54:22

Antworten
Sven R.
  • Forum-Beiträge: 1.904

06.02.2015, 23:39:24 via Website

Irgendwann brauchst du den Kontext zum Speichern. Also kümmer dich erstmal darum, dass du den Kontext in die Methode bekommst.

Wenn dir mein Beitrag gefällt, kannst dich einfach mit dem 👍 "Danke"-Button auf der Website dieses Forums bedanken. 😀

Why Java? - Because I can't C#

Antworten
Stefan W
  • Forum-Beiträge: 424

07.02.2015, 00:39:59 via App

Solange du nicht NULL als Context übergibst, spricht überhaupt nichts dagegen den context einer Methode zu übergeben.
Um ganz ehrlich zu sein, ich war zu faul um mir jetzt alle posts durchzulesen und weiß jetzt auch ned warum dus in einem file speicherst und ned mittels sharedpref oder sqlite DB - dein erstes post hab ich mir durchgelesen ^^

also schreib bitte jetzt mal genau was im moment dein problem is oder schick mir mal deinen code, dann schau ich mir das gerne mal an.

— geändert am 07.02.2015, 00:51:59

Antworten
Antonio P.
  • Forum-Beiträge: 113

07.02.2015, 11:12:25 via Website

Hallo Stefan,

ich habe dir eine PN geschickt. Steht alles drin.

LG
Antonio

— geändert am 07.02.2015, 11:14:28

Antworten
Antonio P.
  • Forum-Beiträge: 113

07.02.2015, 12:58:35 via Website

Ich bin das nun ALLES KOMPLETT wieder durchgegangen und der Context ist doch nicht gleich null. Aber das Problem liegt weiterhin in diesem Teil des Quellcodes.

@Override
protected void onRestart() {
    super.onRestart();
    ColorManager cm = ColorManager.getColorManager(listItemPos);
    cm = cm.readFromFile(getApplicationContext());
    int itemColor = cm.get(index);
    gridView.getChildAt(index).setBackgroundColor(itemColor); //////Hier ist NullPointerException

}

Wenn ich das in der onPause() oder onCreate() machen möchte, dann funktioniert das nicht. Da diese beiden Methoden schon beim ersten Aufruf der Activity aufgerufen werden (siehe Activity Lebenszyklus). Das heißt bevor ich überhaupt ein Item in der GridView ausgewählt habe, kann ich unmöglich die Farbe setzen.

EDIT:
Ich habe auch das serialisieren und deserialisieren getestet, das sieht so weit denke ich mal auch ganz okay aus.

— geändert am 07.02.2015, 13:30:52

Antworten
Sven R.
  • Forum-Beiträge: 1.904

07.02.2015, 13:42:08 via App

Ich verstehe jetzt nicht das Problem, das schon in der OnCreate oder on onresume aufzurufen.
Das gridview ist bestimmt null.

Wenn dir mein Beitrag gefällt, kannst dich einfach mit dem 👍 "Danke"-Button auf der Website dieses Forums bedanken. 😀

Why Java? - Because I can't C#

Antworten
Antonio P.
  • Forum-Beiträge: 113

07.02.2015, 13:50:25 via Website

Pascal P.

Du speicherst das objektorentiert.
Du musst das ganze statisch machen und alles (auch statische liste) serialisieren und speichern.
Sonst funktioniert die Logik mit speuchern nciht.
Und wenn du lädst dann nur im onResume oder im on Crate.
Speicher dann in onDestroy oder onPause.

Das vermute ich auch, dass die GridView NULL ist. Ich denke es liegt daran, dass die GridView jedesmal die Methode getView() aufruft wenn sie ein neues Child View anzeigen möchte. Und mir wird immer wieder ein recycletes Child View zurückgegeben. Ich vermute es liegt daran.

Antworten
Antonio P.
  • Forum-Beiträge: 113

07.02.2015, 14:48:35 via Website

Neuer Stand. Die App stürzt nicht mehr ab wenn ich ein Item auswähle das recyclet wurde. Habe mir eine Methode geschrieben etwas umständlich aber funktioniert.

Jedoch besteht immernoch das Problem:

Färbe ich das 1. Item ein so färbt sich beim runter scrollen das recycelte Element mit.

Was kann man da tun?

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

07.02.2015, 14:57:23 via Website

Hallo Antonio,
habe die App bei mir gerade zum laufen bkommen und schaue mir das ganze jetzt mal an.

LG Pascal

LG Pascal //It's not a bug, it's a feature. :) ;)

Antworten
Antonio P.
  • Forum-Beiträge: 113

07.02.2015, 17:20:02 via App

Und Pascal was konntest du entdecken? Bin sehr gespannt.

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

07.02.2015, 17:39:11 via Website

Bisher habe ich mir deine Detail Activity angeschaut.
Da hattest du das nicht so umgesetzt wie ich das gemeint hatte.
Du hattest keine schleife über alle GridView childs. Das ahbe ich getestet, aber es hat nicht richtig funktioniert.
Wenn man das mit der Farbe jetzt direkt im ArrayAdapter macht, dann passt das auch.
Jetzt fehlt nur noch das serialisieren :)

LG Pascal //It's not a bug, it's a feature. :) ;)

Antworten
Antonio P.
  • Forum-Beiträge: 113

07.02.2015, 18:18:29 via App

Passt das serialisieren nicht? Wie ich das habe?

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

07.02.2015, 18:20:13 via Website

So bin jetzt duch, bei mir Funktioniert das jetzt :)

Änderungen:

  1. MainActivity.java

    ColorManager cm = ColorManager.readFromFile(this);
    if(cm == null){
    for (int i = 0; i {
    ColorManager.addColorManager(i);
    }
    }

Hier wird überprüft ob schonmal etwas gespeichert wurde, wenn ja wird das gespeicherte einfach geladen, und wenn Nein dann werden neue Felder angelegt.

  1. ColorManager.java
    Hier muss eine 2. liste angelegt werden welche nicht static ist, damit alles serialisiert werden kann:
HashMap<Integer, ColorManager> m_colorManagerMap = new HashMap<Integer, ColorManager>();
 public void saveToFile(Context context) {
        try {
          this.m_colorManagerMap = this.colorManagerMap; //Static liste in eine ObjektVaiable schreiben
            FileOutputStream fileOutputStream = context.openFileOutput(savedState, Context.MODE_PRIVATE);
            ObjectOutputStream objectOutputStream = new ObjectOutputStream(fileOutputStream);
            objectOutputStream.writeObject(this);
            objectOutputStream.close();
            fileOutputStream.close();
            Log.i("ColorManager", "Serialisierung erfolgreich");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    // Creates an object by reading it from a file
    public static ColorManager readFromFile(Context context) {
        ColorManager colorManager= null;
        try {
            FileInputStream fileInputStream = context.openFileInput(savedState);
            ObjectInputStream objectInputStream = new ObjectInputStream(fileInputStream);
            colorManager = (ColorManager) objectInputStream.readObject();
            objectInputStream.close();
            fileInputStream.close();
            Log.i("ColorManager", "Deserialisierung erfolgreich");
            ColorManager.colorManagerMap = colorManager.m_colorManagerMap; //Liste wieder static setzen
        } catch (IOException e) {
            e.printStackTrace();
        }
        catch (ClassNotFoundException e) {
            e.printStackTrace();
        }


        return colorManager;
    }
  1. DetailActivity.java
    Hier wird die GetView Methode des ArrayAdapter überschrieben, damit die Farben den richtigen Items zugeordnet werden.

    final ColorManager cm = ColorManager.getColorManager(listItemPos); //den entsprechenden ColorManager laden
    gridView.setAdapter(new ArrayAdapter(this, android.R.layout.simple_list_item_1, array){
    public View getView(int position, View view, ViewGroup viewGroup)
    {
    final View vi = super.getView(position, view, viewGroup);
    String name = (String) this.getItem(position);

                    TextView txtView =   ((TextView)vi);
                    txtView.setText(name);
    
                      if(cm.keyExists(position))
                      {
                        txtView.setBackgroundColor(cm.get(position));
                        Log.d(name, "Set Color:" + cm.get(position) + " for Item pos=" + position);
    
    
                      }
                      else
                      {
                        txtView.setBackgroundColor(Color.WHITE);  
    
                      }
    
    
    
                 return vi;
            }
    
        });
        gridView.setDrawSelectorOnTop(true); //Bei click auf das item kann dieses Markiert werden
    

    @Override
    protected void onRestart() {
    super.onRestart();

    ((ArrayAdapter<String>;)gridView.getAdapter()).notifyDataSetChanged(); //Daten updaten : Bin nicht sicher ob die beiden zeilen benötigt werden
    gridView.invalidate();
    

    //Falls was nicht passt hier reloaden bzw. das in der onResume auch tun

    }

    @Override
    public void onBackPressed() {
    super.onBackPressed();

    ColorManager colorManager = ColorManager.getColorManager(listItemPos);
    colorManager.saveToFile(this);
    

    }

    @Override
    protected void onStop() {
    super.onStop();

    ColorManager colorManager = ColorManager.getColorManager(listItemPos);
    colorManager.saveToFile(this);

    }

    @Override
    protected void onDestroy() {
    super.onDestroy();

    ColorManager colorManager = ColorManager.getColorManager(listItemPos);
    
    colorManager.saveToFile(this);
    

    }

So das wars im großen und ganzen schon.
Wenn du noch Zeit hast, kannst du noch Kleinigkeiten verbessern, z.b. das in der ShowDetail Activity beim erneuten laden das selectedItem wieder angezeigt wird etc.

PS: Wenn das ein Teil einer Schulischen Arbeit ist, bitte denke daran, deinen Code Ordnungsgemäß zu Kommentieren sonst gibt es abzug ;).

LG Pascal //It's not a bug, it's a feature. :) ;)

Antworten
Antonio P.
  • Forum-Beiträge: 113

07.02.2015, 18:43:36 via Website

Wow. Ich weiß echt nicht wie ich mich bei dir bedanken soll. DANKE DANKE. Du hast mich gerettet. Ich muss das jetzt nur noch verstehen was da geht. DANKE DANKE

Antworten