Android veränderbares Array abspeichern und auslesen

aydin94

Mitglied
Hallo,

ich habe einen Code für eine veränderbare Liste geschrieben die auch eig ganz gut Funktioniert. Lediglich beim Speichern und wieder Auslesen der Datei habe ich Probleme.

Hier mein Code:

Java:
    Toolbar mToolbar;
    ActionBar mActionBar;

    public ArrayAdapter<String> adapter;
    private EditText etInput;
    public ArrayList<String> arrayList;
    int position;
    FileOutputStream fos;
    String filename = "cityy";
    private Context context;
   

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        mToolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(mToolbar);
        mToolbar.setTitleTextColor(Color.GREEN);
        mToolbar.setSubtitle("Ey woas geyt?");
        mToolbar.setSubtitleTextColor(Color.BLACK);
        if (Build.VERSION.SDK_INT >= 21) {
            mToolbar.setElevation(25);
        }
        mActionBar = getSupportActionBar();
        if (mActionBar != null) {
            mActionBar.setDisplayHomeAsUpEnabled(true);
        }


        context = MainActivity.this;
        ListView lvListe = (ListView) findViewById(R.id.lvlist);
        etInput = (EditText) findViewById(R.id.etInput);
        Button btnAdd = (Button) findViewById(R.id.btnAdd);

        String[] names = new String[]{""};
        arrayList = new ArrayList<>();
        arrayList.addAll(Arrays.asList(names));

        try {
            InputStream is = openFileInput(filename);
            BufferedReader br = new BufferedReader(new InputStreamReader(is));
            String line;
            while((line = br.readLine()) != null){
                arrayList.add(line);
            }
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }

        // <> == <String>


        adapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, arrayList);

        lvListe.setAdapter(adapter);
        lvListe.setOnItemClickListener(this);
        lvListe.setOnItemLongClickListener(this);

        btnAdd.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                String strInput = etInput.getText().toString();
                if (!TextUtils.isEmpty(strInput)) {
                    adapter.add(strInput);
                    etInput.setText("");
                    adapter.notifyDataSetChanged();
                    try {
                        fos = context.getApplicationContext().openFileOutput(filename, MODE_PRIVATE);
                        PrintWriter pw = new PrintWriter(fos);
                        // PrintWriter pw = new PrintWriter(openFileOutput(filename, MODE_PRIVATE);
                      
                            pw.println(strInput);

                        pw.close();
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
            }
        });

    }




    @Override
    public void onItemClick(AdapterView<?> adapterView, View view, int position, long id) {

        Toast.makeText(this, arrayList.get(position), Toast.LENGTH_SHORT).show();

        Intent intent = new Intent(Intent.ACTION_WEB_SEARCH);
        intent.putExtra(SearchManager.QUERY, "Wetter " + arrayList.get(position));
        startActivity(intent);
    }

    @Override
    public boolean onItemLongClick(AdapterView<?> adapterView, View view, int i, long id) {
        AlertDialog.Builder builder1 = new AlertDialog.Builder(this);
        builder1.setMessage("Möchtest du die Stadt aus dem Verzeichnis löschen?");
        builder1.setCancelable(true);
        builder1.setPositiveButton("Ja", new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int id) {
                        arrayList.remove(position);
                        adapter.notifyDataSetChanged();
                        dialog.cancel();
                    }
                });
        builder1.setNegativeButton("Nein", new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int id) {
                        dialog.cancel();
                    }
                });

        AlertDialog alert11 = builder1.create();
        alert11.show();
        return true;
    }

Wenn ich eine neue Zeile hinzufüge klappt es zwar, aber sobald ich eine neue Zeile hinzufüge überschreibt er die vorherige. Das macht sich aber erst nach dem schließen und wieder öffnen der App bemerkbar.
Außerdem startet die App nicht wenn ich diese erste Leere Zeile(String[] names) nicht der ArrayList übergebe. Ich weiß dass das leicht zu beheben ist aber ich kenne den Code dafür nicht ^^

Achja zudem soll die App mit onItemLongClick die jeweilige Zeile auch aus der Datei entfernen.
Jemand ne Idee?

Ich bin für jede Hilfe Dankbar.

Gruß Aydin
 
Zuletzt bearbeitet von einem Moderator:

buggy84

Bekanntes Mitglied
Also ich sehe hier eine onCreate Methode. Wo wird was genau gespeichert und wieder geladen? Was genau hast Du denn überhaupt vor?
Bei vielen Sachen reicht es den Code step-by-step im Debug-Mode zu durchlaufen und dann nochmal drüber nachzudenken.
Ich weiß dass das leicht zu beheben ist aber ich kenne den Code dafür nicht ^^

Das ist meistens so. Eventuell helfen Dokumentationen weiter.

Beschreib mal was Du genau möchtest, eventuell kann man Dir Anhaltspunkte liefern.
 

aydin94

Mitglied
Java:
 btnAdd.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                String strInput = etInput.getText().toString();
                if (!TextUtils.isEmpty(strInput)) {
                    adapter.add(strInput);
                    etInput.setText("");
                    adapter.notifyDataSetChanged();
                    try {
                        fos = context.getApplicationContext().openFileOutput(filename, MODE_PRIVATE);
                        PrintWriter pw = new PrintWriter(fos);
                     
                        pw.println(strInput);

                        pw.close();
                    } catch (Exception e) {
                        e.printStackTrace();
                    }

Hier wird der Liste ein neues Element übergeben. Allerdings ist die Liste immer nur eine Zeile groß da sie das alte Element durch das neu eingegebene Element ersetzt.
Ich brauche also einen Code der dem PrintWriter sagt, dass er das neue Element in eine neue Zeile einfügen soll. Screenshot_2015-09-25-10-42-50.png Screenshot_2015-09-25-09-20-49.pngScreenshot_2015-09-25-09-20-59.png
Im ersten Bild wird das Element Frankfurt hinzugefügt. Im 2. Bild sieht man dass das eigentlich ganz gut funktioniert. Wenn man die App allerdings schließt und wieder öffnet sieht man dass das neu hinzugefügte Element das alte Ersetzt hat. Also brauch ich irgendwie eine printNextLine methode o.ä. .

Zudem will ich diese mit der Methode OnItemLongClick wieder herauslöschen. Dies macht der aber bisjetzt nur auf der UI und nicht auf der Datei. Heißt wenn ich ein Element lösche, ist es nach dem neustarten der App wieder da.

3. Punkt: Wie man sieht ist das Erste Element leer weil ich der arrayList "String[] names" hinzugefügt habe was auch nur einen leeren String enthält. Wie schaff ich es ein solches arrayList aufzubauen ohne ihm einen array übergeben zu müssen.
 
Zuletzt bearbeitet von einem Moderator:

buggy84

Bekanntes Mitglied
Bei jedem Klick auf deinen Button schreibst Du auf einen Stream. Dieser Stream hat aber nur eine Zeile, nämlich den User-Input. Es wird also nix dazu geschrieben. Zusätzlich wird deine bestehende Datei auch noch überschrieben. Abhilfe: Schreibe alle deine Daten auf den Stream, nicht nur die eine neue Zeile.

Wenn Du lange drückst, löscht Du eine Zeile in deiner UI, aber du speicherst die Datei nicht neu ab, daher hast Du nach dem Neustart selbstverständlich wieder die alten Daten da.
Abhilfe: Datei neu schreiben.

Beim 3. Punkt bin ich mir nicht sicher, warum Du deine Liste mit einer leeren Zeile füllst. Sobld die App einmal gestartet wurde, und damit erfolgreich eine Datei geschrieben wurde, kannst Du die doch einlesen. Ich halte das Initialisieren mit einer leeren Zeile für unnütz. Das kannst Du eleganter lösen. Beim allerersten Start beispielsweise könnte man beliebte Städte als "default" anzeigen (Düsseldorf, Berlin, München, Bonn)... oder auch unbeliebte Städte... oder Städte die keiner kennt...
Anhilfe:Kreativ werden :)
 

aydin94

Mitglied
Die Frage ist ja wie ich das Anstelle :)
Ich habe desöfteren versucht die ganze Liste dem Stream zu übergeben was allerdings schief gelaufen ist. Hab zwar viel rumgeforscht aber als Anfänger komm ich einfach nicht drauf.

Das mit dem löschen ist ne gute Idee. Dafür muss ich dann aber das 1. Problem lösen :D

Das war auch zuerst mit mehreren Default Werten gefüllt. Allerdings möchte ich diese nicht haben und nach jedem neustart werden die ja wieder hinzugefügt da sie nur in der UI existieren..
Wie erstelle ich also die Liste ohne die Default werte?

Danke für deine Hilfe (Y)
 

buggy84

Bekanntes Mitglied
Hallihallo!
Ich hab dir hier eine gute Seite gesucht, in der ArrayList gut beschrieben wird. Da findest du auch Infos wie man durch die ArrayList per Schleife läuft und sich die gespeicherten werte wieder holt.

http://javarevisited.blogspot.de/2011/05/example-of-arraylist-in-java-tutorial.html?m=1

Wenn du das durch hast, dann kommst du mit Punkt 1 und 2 klar.

Bei Nummer 3 ist deine Kreativität gefragt. Ich würde prüfen ob bereits eine Datei existiert (und passenden Inhalt hat). Wenn ja, dann würde ich diese Werte laden. Wenn nicht, dann würde ich default werte setzen. Ganz easy.

Und jetzt ran an den Code, melde dich wenn es Fragen gibt!
 

aydin94

Mitglied
Ich weiß nicht ob du meine Frage richtig verstanden hast aber die Seite hilft mir keinen Stück weiter. Da geht es nur um die "UI" ArrayList. Nirgends wird erwähnt wie ich diese Abspeichern kann.
Außerdem geht es nur mit festen Werten eines Arrays. Ich suche aber eine Methode um ein variables Array abzuspeichern. Einfach gesagt wie man eine ToDo Liste erstellt ohne das abhaken oder sonstigen schnick schnack.

Bitte um Code Schnipsel
 

buggy84

Bekanntes Mitglied
Deine Frage habe ich verstanden.
Nirgends wird erwähnt wie ich diese Abspeichern kann.
Korrekt, die Abspeichergeschichte hast Du ja bereits geschrieben. Das Problem, oder Dein Denkfehler, habe ich Dir erläutert. Du musst durch die Daten in deinem Array gehen, und diese auf den Stream schieben.
Ich habe desöfteren versucht die ganze Liste dem Stream zu übergeben was allerdings schief gelaufen ist.
Dafür war der Link gedacht. In Example 5 steht genau das drin. Du muss es nur auf Dein Beispiel übertragen.

Code:
for(int i = 0; i < stringList.size(); i++)
   String item = stringList.get(i);
   System.out.println("Item " + i + " : " + item);}

From Java 5 onwards you can use foreach loop as well
for(String item: stringList){
System.out.println("retrieved element: " + item);}

Das musst Du schon selbst machen. Wenn ich Dir das jetzt auf dein Beispiel übertrage, und Du mit Copy&Paste
arbeitest, geht das erstens schief und zweitens hast Du nichts gelernt. Also Proogrammierer/in hast Du alle Werkzeuge an der Hand, Du musst sie aber auch einsetzen können. Da darf auch try&error nicht fehlen.

Konkrete Fragen dazu beantworte ich gern im Forum, aber Deinen Code musst Du selbst schreiben.
 

Ähnliche Java Themen

Neue Themen


Oben