ListView füllen mit Daten aus den SharedPreferences

  • Antworten:12
  • Bentwortet
Syntac Moore
  • Forum-Beiträge: 44

25.04.2014, 14:37:14 via Website

Hey, Ich bins mal wieder^^.. Also ich hab meine Methode um Daten in die SharedPreferences zu speichern.

Button btnSpeichern = (Button)findViewById(R.id.btxSpeichern);
    btnSpeichern.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {

        SavePreferences("ORD", lblPizzaOrder.getText().toString());

        }
    });
private void SavePreferences(String key, String value)
{
    SharedPreferences sharedPreferences = getPreferences(MODE_PRIVATE);
    SharedPreferences.Editor editor = sharedPreferences.edit();
    editor.putString(key, value);
    editor.commit();
}   

Ich denk mal, dass die soweit stimmt.

Darin wird dann das aus meiner TextView "lblPizzaOrder" gespeichert.

Das was gespeichert wurde will ich nun in einer anderen Activity in einer ListView anzeigen.

Die LoadMethode hab ich auch schon, zur Hälfte..

private void LoadPreferences()
{
    SharedPreferences sharedPreferences = getPreferences(MODE_PRIVATE);
    String strOrder = sharedPreferences.getString("ORD","");

Aber um etwas in einer ListView anzuzeigen, brauch ich einen Adapater, so wie wenn ich aus einer ArrayList etwas in einer LV anzeigen möchte, da brauch ich ja einen ArrayAdapter. Wie ist das jetzt bei den SharedPreferences?

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

25.04.2014, 14:43:24 via Website

Ganz einfach, du erstellst einen Array Adapter und übergibst diesem deinen String order. Aber macht das wirklich Sinn, für einen einzigen String eine LV zu nehmen?

oder kommen noch andere Strings hinzu, dann wird aus diesen Strings ein String Array erstellt und dieses dem Adapter übergeben.

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

Antworten
Syntac Moore
  • Forum-Beiträge: 44

25.04.2014, 15:08:16 via Website

Ja also habs mir so gedacht, dass ich mehr als nur einen String anzeige. Ich tu ja in der ersten activity sogesehen eine Pizza erstellen und die tu ich über einen Button noch in der ersten activity speichern. Die zweite Activity besteht nur aus einer ListView die die gespeicherten Pizzen anzeigt.

ListView lvPizzaOrder;
Pizza meinePizza;
ArrayList<Pizza> meinePizzenListe;
ArrayAdapter<String>meinAdapter;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_gespeicherte_pizzen);

    ListView lvPizzaOrder = (ListView)findViewById(R.id.lvxPizzen);

    meinePizzenListe = new ArrayList<Pizza>();
    meinAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1);
    lvPizzaOrder.setAdapter(meinAdapter);

So das hät ich jetzt.

Wie hol ich jetzt den String aus den SharedPreferences und übergib diesen an die ArrayList?

private void LoadPreferences()
{
    SharedPreferences sharedPreferences = getPreferences(MODE_PRIVATE);
    String strOrder = sharedPreferences.getString("ORD","");
    meinAdapter.clear();
    for (int i = 0; i < meinePizzenListe.size(); i++) {
        meinePizza = meinePizzenListe.get(i);
        meinAdapter.add(strOrder);
    }
}

Geht das so? Und rein theoretisch muss das alles in der ersten Activity stehen, weil in der 2. lass ichs ja nur anzeigen?

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

25.04.2014, 15:14:02 via Website

Wenn du doch insgesamt mehrere poizzen hast, wieo machst dir dann nicht eine Klasse Pizza, die die Eigenschafen order, Name etc hat. Dann hast du ein PizzaObjekt und kannst dieses später abfragen. Zusätzlich machst du dir dann noch eine Liste mit allen Pizza Objekten. (Ist nur ein Vorschlag, aber so würde ich es einfacher finden)

Zum erstellen des String Arrays, fügst du einfach die benötigten Strings zum Array hinzu.

http://stackoverflow.com/questions/2843366/how-to-add-new-elements-to-an-array

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

Syntac Moore

Antworten
Syntac Moore
  • Forum-Beiträge: 44

25.04.2014, 15:23:44 via Website

Ok, dann werden die SharedPreferences unnötig, oder?

Antworten
Syntac Moore
  • Forum-Beiträge: 44

25.04.2014, 15:42:17 via Website

Also ich habs jetzt mal umgeändert, eine neue Klasse Pizza erstellt mit der Eigenschaft StrOrder.

    Button btnSpeichern = (Button) findViewById(R.id.btxSpeichern);
    btnSpeichern.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            // SavePreferences("ORD", lblPizzaOrder.getText().toString());
            meinePizza = new Pizza();
            meinePizza.setStrOrder(lblPizzaOrder.getText().toString());
        }
    });

In der 1. Activity wird hier der Text aus der TextView rausgeholt und in StrOrder gespeichert.

    ListView lvPizzaOrder;
Pizza meinePizza;
ArrayList<Pizza> meinePizzenListe;
ArrayAdapter<String> meinAdapter;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_gespeicherte_pizzen);

    ListView lvPizzaOrder = (ListView) findViewById(R.id.lvxPizzen);

    meinePizzenListe = new ArrayList<Pizza>();
    meinAdapter = new ArrayAdapter<String>(this,
            android.R.layout.simple_list_item_1);
    lvPizzaOrder.setAdapter(meinAdapter);
    LoadPizzen();

}

// LoadPizzen Methode

private void LoadPizzen() {

    meinAdapter.clear();
    for (int i = 0; i < meinePizzenListe.size(); i++) {
        meinePizza = meinePizzenListe.get(i);
        meinAdapter.add(meinePizza.getStrOrder());
    }
}

Und das ist meine 2. Activity.

Die PizzenLoader Methode ruft dann das was in StrOrder ist auf und übergibt diesen dem ArrayAdapter.

Ich habs mal laufen lassen, es funktioniert aber nicht, ich erhalte auch keinen Fehler im LogCat. Woran könnte das liegen?

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

25.04.2014, 16:53:44 via Website

Wenn du genau schause, an was könnte das liege?

Wenn ich deine pizzenListe anschaue, fügst du da nie Elemente hinzu, dh. sie bleibt leer -> die Schleife wird nicht durchlaufen

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

Antworten
Syntac Moore
  • Forum-Beiträge: 44

25.04.2014, 17:16:37 via Website

Also muss ich so etwas tun

meinePizzenListe.add(meinePizza); ?

Aber wo genau füll ich die Liste?

Weil wenn ich das bereits in der 1. Activity mache, da wo ich meinePizza fülle, dann erhalt ich diesen Fehler:

04-25 15:12:19.190: W/KeyCharacterMap(696): No keyboard for id 0 04-25 15:12:19.190: W/KeyCharacterMap(696): Using default keymap: /system/usr/keychars/qwerty.kcm.bin 04-25 15:12:21.419: D/AndroidRuntime(696): Shutting down VM 04-25 15:12:21.419: W/dalvikvm(696): threadid=1: thread exiting with uncaught exception (group=0x4001d800) 04-25 15:12:21.430: E/AndroidRuntime(696): FATAL EXCEPTION: main 04-25 15:12:21.430: E/AndroidRuntime(696): java.lang.NullPointerException 04-25 15:12:21.430: E/AndroidRuntime(696): at de.winfprojekt.Konfigurator$5.onClick(Konfigurator.java:84) 04-25 15:12:21.430: E/AndroidRuntime(696): at android.view.View.performClick(View.java:2408) 04-25 15:12:21.430: E/AndroidRuntime(696): at android.view.View$PerformClick.run(View.java:8816) 04-25 15:12:21.430: E/AndroidRuntime(696): at android.os.Handler.handleCallback(Handler.java:587) 04-25 15:12:21.430: E/AndroidRuntime(696): at android.os.Handler.dispatchMessage(Handler.java:92) 04-25 15:12:21.430: E/AndroidRuntime(696): at android.os.Looper.loop(Looper.java:123) 04-25 15:12:21.430: E/AndroidRuntime(696): at android.app.ActivityThread.main(ActivityThread.java:4627) 04-25 15:12:21.430: E/AndroidRuntime(696): at java.lang.reflect.Method.invokeNative(Native Method) 04-25 15:12:21.430: E/AndroidRuntime(696): at java.lang.reflect.Method.invoke(Method.java:521) 04-25 15:12:21.430: E/AndroidRuntime(696): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868) 04-25 15:12:21.430: E/AndroidRuntime(696): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626) 04-25 15:12:21.430: E/AndroidRuntime(696): at dalvik.system.NativeStart.main(Native Method)

Und in der Zeile 84 steht genau: meinePizzenListe.add(meinePizza);

EDIT: NullPointerException ist weg, aber es passiert immer noch nichts.

— geändert am 25.04.2014, 17:20:43

Antworten
Syntac Moore
  • Forum-Beiträge: 44

25.04.2014, 19:18:30 via Website

Passiert immer noch nichts, kein Fehler, rein gar nichts.

Also das ist meine Klasse in der die gespeicherten Pizzen angezeigt werden sollen.

public class GespeichertePizzen extends Activity {
ListView lvPizzaOrder;
Pizza meinePizza;
ArrayList<Pizza> meinePizzenListe;
ArrayAdapter<String> meinAdapter;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_gespeicherte_pizzen);

    ListView lvPizzaOrder = (ListView) findViewById(R.id.lvxPizzen);

    meinePizzenListe = new ArrayList<Pizza>();
    meinAdapter = new ArrayAdapter<String>(this,
            android.R.layout.simple_list_item_1);
    lvPizzaOrder.setAdapter(meinAdapter);
    LoadPizzen();
}
// LoadPizzen Methode
private void LoadPizzen() {
    meinAdapter.clear();
    for (int i = 0; i < meinePizzenListe.size(); i++) {
        meinePizza = meinePizzenListe.get(i);
        meinAdapter.add(meinePizza.getStrOrder());
        meinAdapter.notifyDataSetChanged();
    }
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.activity_gespeicherte_pizzen, menu);
    return true;
}

} Und hier der Button in der ersten Activity der das abspeichert.

    Pizza meinePizza;
ArrayList<Pizza> meinePizzenListe;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_konfigurator);
// *******************************************************************
    Button btnSpeichern = (Button) findViewById(R.id.btxSpeichern);
    btnSpeichern.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            // SavePreferences("ORD", lblPizzaOrder.getText().toString());
            meinePizzenListe = new ArrayList<Pizza>();
            meinePizza = new Pizza();
            meinePizza.setStrOrder(lblPizzaOrder.getText().toString());
            meinePizzenListe.add(meinePizza);
        }
    });
    // **********************************************************

— geändert am 25.04.2014, 19:22:04

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

25.04.2014, 19:30:55 via Website

ok, jetzt ist mir klar, was du noch nicht begriffen hast, deine PizzenListe ist immernoch leer. Die Beiden PizzenListen in Activity 1 und 2 haben nichts miteinander zu tun und wissen auch nichts voneinander. Du musst die erste Liste über ein Intent zu der zweiten Activity übergeben. Dort kannst du dann das intent auswerten und die PizzaListe aus der ersten Activity laden. Hier ein Beispiel für das Übergeben von Variablen über ein intent:

http://www.noobis.de/android/203-android-zwischen-activity-wechseln-und-werte-uebergeben.html

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

Antworten
Syntac Moore
  • Forum-Beiträge: 44

27.04.2014, 15:19:45 via Website

Ok, also hab das mal anhand einer TextView probiert. Funktioniert gut. Aber ich will ja eine ArrayList übergeben und in einer ListView anzeigen.

Dazu hab ich mal folgendes ausprobiert:

1.Activity

Button btnSpeichern = (Button) findViewById(R.id.btxSpeichern);
    btnSpeichern.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {

            meinePizzenListe = new ArrayList<String>();               
            meinePizzenListe.add(strOrder);
            Intent intent = new Intent(getApplicationContext(),GespeichertePizzen.class);
            intent.putStringArrayListExtra("pizza", meinePizzenListe);
            startActivity(intent);


        }
    });

2.Activity

Hier häng ich im Moment.

ListView lvPizzen = (ListView)findViewById(R.id.listView1);

    meinAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1);
    lvPizzen.setAdapter(meinAdapter);       

    meinePizzenListe = getIntent().getStringArrayListExtra("pizza");

Jetzt hab ich ja das aus der ersten Activity in der 2. wenn ich mich nicht irre, oder?

Wie genau mach ich das jetzt mit dem Adapter?

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

27.04.2014, 18:14:59 via App

Deine Pizzen liste ist eine liste von pizza Objekten. In der zweiten Activity musst du das Array in ein Pizzaarray casten

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

Syntac Moore

Antworten