ListView mit Items füllen ohne setContentView

  • Antworten:27
  • OffenNicht stickyNicht beantwortet
  • Forum-Beiträge: 37

06.05.2014, 13:48:59 via Website

Hey Leute,

image

Nochmal kurz erklärt:
Ich will eine ListView mit Informationen füllen ohne das Layout der ListView zu setzen.

Mein Versuch:

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

    TrainingList.add(" Test1" ) ;

Ist die Überlegung richtig oder mache ich etwas grundlegendes falsch?
Wichtig ist auch, dass alle Informationen dauerhaft in der Liste gespeichert werden.

Danke für eure Hilfe!

— geändert am 06.05.2014, 13:52:54

Antworten
  • Forum-Beiträge: 21

06.05.2014, 14:16:43 via Website

Da gibt es mehreres zu beachten.

  • Dein Code zeigt sehr wenig. Es sieht so aus als ob du nur irgend eine art von Liste befüllen möchtest. Das hat erstmal noch garnix mit der grafischen Ausgabe zu tun.

  • Um die Daten von einer Liste in einem Listview anzuzeigen benötigst du in der Regel einen Adapter wie den Baseadapter oder einen Arrayadapter

  • Wenn du die Daten in der Liste anzeigen möchtest benötigst du auf jeden Fall irgend ein Layout auch wenn es sich dabei nur um das Standartlayout handelt wobei es sich nur um einen simplen Text handelt

  • Dauerhaft gespeichert wird dabei noch garnichts nur angezeigt

Wenn du genaue Hilfe möchtest solltest du genauer sagen was du überhaupt erreichen möchtest.

Antworten
  • Forum-Beiträge: 21

06.05.2014, 15:00:37 via Website

Auch der Simpleadapter nutzt doch ein layout nur ist das eben schon gegeben.

Antworten
Pascal P.
  • Mod
  • Blogger
  • Forum-Beiträge: 10.164

06.05.2014, 15:02:21 via Website

Wieso willst du das unbedingt ohne Layout machen?
Du brauchst doch nur in der richtigen XML eine List view definieren.

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

Antworten
  • Forum-Beiträge: 37

06.05.2014, 15:06:55 via Website

List<String> TrainingList = new ArrayList<String>();

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


        SimpleDateFormat dfDate  = new SimpleDateFormat("dd/MM/yyyy");
        String data="";
        Calendar c = Calendar.getInstance(); 
        data=dfDate.format(c.getTime());

        TrainingList.add("Anfänger" + "      " + "verbrauchte Kcal: 15 kcal" + "\n" + data );
        listeFill();



    }





public void listeFill(){

        setContentView(R.layout.trainingstagebuch);
        ArrayAdapter<String> adapterVerlauf = new ArrayAdapter<String>(Ende.this, android.R.layout.simple_list_item_1,TrainingList);
        ListView Verlauf1 = (ListView) findViewById(R.id.listview);
        Verlauf1.setAdapter(adapterVerlauf);
    }

Das ganze soll so eine Art Trainingstagebuch werden, d.h. ich möchte Namen des Trainings, das Datum und eine Kalorienzahl speichern (alles Strings).
Das ganze funktioniert auch, d.h. die Liste wird gefüllt. Allerdings rufe ich zweimal die setContentView auf was ich ja nicht möchte.

Der Code den ich oben geschrieben habe ist in der EndeActivity. Hier soll das ListView Layout aber eigtl nicht angezeigt werden. Es soll nur nach Abschluss des Trainings die oben genannten Infos zur Liste hinzugefügt werden. Angezeigt soll die Liste erst werden, wenn ich auf den entsprechenden Button klicke.

Antworten
Pascal P.
  • Mod
  • Blogger
  • Forum-Beiträge: 10.164

06.05.2014, 15:15:08 via Website

Du musst das ja auch nicht mit setContentView setzen sondern du definierst ein XML layout auf dem sich die ListView befindet
Dann musst du diese per findViewById finden und dann nur noch die Daten einfüllen
Zu speichern kannst du eine DB benutzen oder einfacher di benutzt die Shared Preferences.
Da solltest du schauen was für dich geschickter ist.

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

Antworten
  • Forum-Beiträge: 37

06.05.2014, 15:20:14 via Website

Habe jetzt mal das 2. setContentView ausgeklammert:

//setContentView(R.layout.trainingstagebuch);

Das Layout:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="horizontal" >

    <ListView
        android:id="@+id/listview"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent" >
    </ListView>

</LinearLayout>

Dann bekomme ich exceptions:

05-06 13:18:21.758: E/AndroidRuntime(2727): FATAL EXCEPTION: main
05-06 13:18:21.758: E/AndroidRuntime(2727): Process: de.basti12354.bikinifigur2, PID: 2727
05-06 13:18:21.758: E/AndroidRuntime(2727): java.lang.RuntimeException: Unable to start activity ComponentInfo{de.basti12354.bikinifigur2/de.basti12354.schwierigkeitBegin.Ende}: java.lang.NullPointerException
05-06 13:18:21.758: E/AndroidRuntime(2727):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2195)
05-06 13:18:21.758: E/AndroidRuntime(2727):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2245)
05-06 13:18:21.758: E/AndroidRuntime(2727):     at android.app.ActivityThread.access$800(ActivityThread.java:135)
05-06 13:18:21.758: E/AndroidRuntime(2727):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1196)
05-06 13:18:21.758: E/AndroidRuntime(2727):     at android.os.Handler.dispatchMessage(Handler.java:102)
05-06 13:18:21.758: E/AndroidRuntime(2727):     at android.os.Looper.loop(Looper.java:136)
05-06 13:18:21.758: E/AndroidRuntime(2727):     at android.app.ActivityThread.main(ActivityThread.java:5017)
05-06 13:18:21.758: E/AndroidRuntime(2727):     at java.lang.reflect.Method.invokeNative(Native Method)
05-06 13:18:21.758: E/AndroidRuntime(2727):     at java.lang.reflect.Method.invoke(Method.java:515)
05-06 13:18:21.758: E/AndroidRuntime(2727):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779)
05-06 13:18:21.758: E/AndroidRuntime(2727):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)
05-06 13:18:21.758: E/AndroidRuntime(2727):     at dalvik.system.NativeStart.main(Native Method)
05-06 13:18:21.758: E/AndroidRuntime(2727): Caused by: java.lang.NullPointerException
05-06 13:18:21.758: E/AndroidRuntime(2727):     at de.basti12354.schwierigkeitBegin.Ende.listeFill(Ende.java:100)
05-06 13:18:21.758: E/AndroidRuntime(2727):     at de.basti12354.schwierigkeitBegin.Ende.onCreate(Ende.java:60)
05-06 13:18:21.758: E/AndroidRuntime(2727):     at android.app.Activity.performCreate(Activity.java:5231)
05-06 13:18:21.758: E/AndroidRuntime(2727):     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087)
05-06 13:18:21.758: E/AndroidRuntime(2727):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2159)
05-06 13:18:21.758: E/AndroidRuntime(2727):     ... 11 more

Antworten
Pascal P.
  • Mod
  • Blogger
  • Forum-Beiträge: 10.164

06.05.2014, 15:22:13 via Website

Vlt mal genau durchlesen
Dort steht alles drin
Was steht denn dort:

/AndroidRuntime(2727): at de.basti12354.schwierigkeitBegin.Ende.listeFill(Ende.java:100)

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

Antworten
Pascal P.
  • Mod
  • Blogger
  • Forum-Beiträge: 10.164

06.05.2014, 15:47:08 via Website

Und wo initialisiert du Verlauf1?

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

Antworten
  • Forum-Beiträge: 37

06.05.2014, 15:50:47 via Website

ListView Verlauf1 = (ListView) findViewById(R.id.listview);

Eine Zeile darüber also Zeile 99

Antworten
Pascal P.
  • Mod
  • Blogger
  • Forum-Beiträge: 10.164

06.05.2014, 15:54:23 via Website

Gibt es auf deinem XML Layout so eine ListView?
Setzt du das XML per setContent view?

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

Antworten
  • Forum-Beiträge: 37

06.05.2014, 15:57:20 via Website

Das XML-File:

 <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:orientation="horizontal" >

        <ListView
            android:id="@+id/listview"
            android:layout_width="fill_parent"
            android:layout_height="fill_parent" >
        </ListView>


    </LinearLayout>

Nein ich setze ein anderes Layout als setContentView!
Dies war genau meine Frage.

Antworten
Pascal P.
  • Mod
  • Blogger
  • Forum-Beiträge: 10.164

06.05.2014, 16:16:47 via Website

Wenn du etwas in die ListView schreiben willst, brauchst du das Layout dazu, d.h. du musst es vorher setzen.
Aber wieso machst du alles in einer Activity ist einfacher und überschtlicher wenn du es in mehrere Aufteilst für die Dateneingabe und eins für die Auswertung etc.
Dann musst du je Activity nur ein Layout setzen

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

Antworten
  • Forum-Beiträge: 37

06.05.2014, 16:24:33 via Website

Hä ich verstehe nicht genau was du meinst ;)

Das ganze läuft aktuell so ab:

Haupmenü -> Buttons: Start und Trainingsübersicht
-> Klick auf Start ->Übung1 -> Übung2...-> Trainingsende (Hier soll das ganze jetzt abgespeichert werden!)
-> Klick auf Trainingsübersicht -> Training 1 am 03.04,2014 usw ( hier soll es angezeigt werden!)

Antworten
Pascal P.
  • Mod
  • Blogger
  • Forum-Beiträge: 10.164

06.05.2014, 17:10:48 via Website

Ja aber wieviele Activities hast du? eine oder merere?
Wenn du zu jeder UI eine Activity hast, ist das ok, sonst wir es unübersichtlich.
Sorry bin gerade etwas verwirrt.Bitte Poste mal deine nkomplette ende Code da wo alles angezeigt werden soll.

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

Antworten
  • Forum-Beiträge: 37

06.05.2014, 17:22:20 via Website

Pascal P.

Ja aber wieviele Activities hast du? eine oder merere?
Wenn du zu jeder UI eine Activity hast, ist das ok, sonst wir es unübersichtlich.
Sorry bin gerade etwas verwirrt.Bitte Poste mal deine nkomplette ende Code da wo alles angezeigt werden soll.

Habe für eigtl für alles eine eigene Activity: Start, Übung1, Übung2.... Ende, TrainingsTagebuchAufrufen
Jede dieser Activities hat ein eigenes Layout.

import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;

import de.basti12354.bikinifigur2.R;

import de.basti12354.bikinifigur2.Einstellungen;
import de.basti12354.bikinifigur2.MainActivity;
import de.basti12354.bikinifigur2.Uebungen;


import android.app.Activity;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.DialogInterface.OnClickListener;
import android.content.res.Configuration;
import android.media.AudioManager;
import android.media.MediaPlayer;

import android.os.Bundle;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.ImageView;
import android.widget.ListView;

public class Ende extends Activity implements android.view.View.OnClickListener {
    public MediaPlayer uebung;
    public ImageView haupt;
    public ImageView wdh;


    List<String> TrainingList = new ArrayList<String>();

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.training_beendet);
        uebung = MediaPlayer.create(this, R.raw.trainende);
        uebung.start();

        // OnClickListener
        haupt = (ImageView) findViewById(R.id.hauptmenu);
        haupt.setOnClickListener(this);

        wdh = (ImageView) findViewById(R.id.wiederholen);
        wdh.setOnClickListener(this);

        setVolumeControlStream(AudioManager.STREAM_MUSIC);
        getActionBar().setTitle("Hauptmenü");

        SimpleDateFormat dfDate  = new SimpleDateFormat("dd/MM/yyyy");
        String data="";
        Calendar c = Calendar.getInstance(); 
        data=dfDate.format(c.getTime());

        TrainingList.add("Anfänger" + "      " + "verbrauchte Kcal: 15 kcal" + "\n" + data );
        listeFill();



    }

    @Override
    public void onClick(View v) {
        // TODO Auto-generated method stub
        switch (v.getId()) {
        case R.id.hauptmenu:
            Intent intent = new Intent(v.getContext(), MainActivity.class);
            startActivity(intent);
            break;

        case R.id.wiederholen:
            Intent intent2 = new Intent(v.getContext(), Uebung1.class);
            startActivity(intent2);
            break;
        }

    }

    @Override
    public void onConfigurationChanged(Configuration newConfig) {
        super.onConfigurationChanged(newConfig);
        //setContentView(R.layout.training_beendet);

        haupt = (ImageView) findViewById(R.id.hauptmenu);
        haupt.setOnClickListener(this);

        wdh = (ImageView) findViewById(R.id.wiederholen);
        wdh.setOnClickListener(this);

    }
    public void listeFill(){

        //setContentView(R.layout.trainingstagebuch);
        ArrayAdapter<String> adapterVerlauf = new ArrayAdapter<String>(Ende.this, android.R.layout.simple_list_item_1,TrainingList);
        ListView Verlauf1 = (ListView) findViewById(R.id.listview);
        Verlauf1.setAdapter(adapterVerlauf);
    }
}

Antworten
Pascal P.
  • Mod
  • Blogger
  • Forum-Beiträge: 10.164

06.05.2014, 17:43:32 via Website

Dann ist es doch kalr.
1 setContent view für das XML und es sollte funktionieren

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

Antworten
  • Forum-Beiträge: 37

06.05.2014, 17:48:08 via Website

Pascal P.

Dann ist es doch kalr.
1 setContent view für das XML und es sollte funktionieren

ja es funktioniert, wenn ich das ausklammere aber es ist das falsche Layout
-> Ich muss setContentView(R.layout.training_beendet); anzeigen, nicht dieses ausgeklammerte
setContentView(R.layout.trainingstagebuch);

Antworten

Empfohlene Artikel