ListView mit Items füllen ohne setContentView

  • Antworten:27
Basti Steer
  • 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
JustinTime
  • 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
impjor
  • Forum-Beiträge: 1.793

06.05.2014, 14:41:26 via App

Wenn du nur reinen Text in der Liste anzeigen möchtest, kannst du auch einen SimpleAdapter verwenden. Dann brauchst du kein eigenes Layout.

Liebe Grüße impjor.

Für ein gutes Miteinander: Unsere Regeln
Apps für jeden Einsatzzweck
Stellt eure App vor!

Antworten
JustinTime
  • 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.
  • Admin
  • Forum-Beiträge: 11.286

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
Basti Steer
  • 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.
  • Admin
  • Forum-Beiträge: 11.286

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
Basti Steer
  • 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.
  • Admin
  • Forum-Beiträge: 11.286

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
Basti Steer
  • Forum-Beiträge: 37

06.05.2014, 15:23:51 via Website

Verlauf1.setAdapter(adapterVerlauf);

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

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
Basti Steer
  • 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.
  • Admin
  • Forum-Beiträge: 11.286

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
Basti Steer
  • 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.
  • Admin
  • Forum-Beiträge: 11.286

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
Basti Steer
  • 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.
  • Admin
  • Forum-Beiträge: 11.286

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
Basti Steer
  • 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.
  • Admin
  • Forum-Beiträge: 11.286

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
Basti Steer
  • 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
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

06.05.2014, 18:01:39 via Website

Dann mach das doch was ist das Problem dabei.
Warum musst du in einer Activity überhaupt 2 mal setContetnt view verwenden wenn du doch für jedes layout eine handler Activity hast?

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

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

06.05.2014, 18:01:53 via Website

Sorry für den Doppelpost

— geändert am 06.05.2014, 18:02:56

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

Antworten
Basti Steer
  • Forum-Beiträge: 37

06.05.2014, 18:37:28 via Website

Ja genau das will ich doch wissen, wie ich das programmieren kann, dass ich dies nicht tun muss.
Nochmal ganz kurz: Ich will am Ende einer Activity mit Layout A, die ListView des Layouts B füllen (ich kann aber nicht die Activity von Layout B
aufrufen)

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

06.05.2014, 18:42:08 via Website

Na ja können tust du den Activity aufruf schon, aber dann ist dein Code nicht getrennt.
Pronzipiell kannst du dann eine Funktion erstellen die dann mit setContentView die XML der Activity b setzen
Dann musst du den Arrrayadapter etc initialisieren und dann die ListView füllen

Aber warum willst du dafür nicht die 2. Activity erstellen.

— geändert am 06.05.2014, 18:42:23

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

Antworten
Basti Steer
  • Forum-Beiträge: 37

06.05.2014, 19:01:14 via Website

Ich rufe nach der EndeActivity die HauptmenüActivity auf, daher kann ich keine andere Activity aufrufen oder habe ich jetzt einen krassen Denkfehler drin ;)

Nochmal das Schema:

Activities:
Hauptmenü -> Start -> Übung1.. -> Ende -> Hauptmenü => diese haben alle ein eigenes Layout

im Hauptmenü gibt es neben einem Start Button noch den Trainingsverlauf-Button mit besagter ListView

Ich möchte jetzt immer, wenn das Training vorbei ist => also die EndeActivity aufgerufen wird , das Training und das Datum in einer Liste speichern

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

06.05.2014, 19:24:43 via Website

Nochmal zu dem Post oben :
Was befindet sich in deiner Ende Acticity doch nur die List View in der alles angezeigt werden soll oder nicht?

Ist doch egal dann rufe halt nach der EndeActivity eine ListView Activty oä auf. und aus dieser erst die Hauptmenü Act.
Das mit dem Speichern ist so eine Sache, vlt solltest du dir dafür eine DB anlegen oder einfach die SharedPrefernces nuten, aber dort kannst du schlecht eine Liste speichern

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

Antworten
impjor
  • Forum-Beiträge: 1.793

06.05.2014, 22:04:39 via App

Am besten trennst du die Logik von der Anzeige.

Du versuchst die Trainings-Infos in der ListView einer anderen Activity zu speichern - keine gute Idee. Die ListView ist nur zum Anzeigen da.
Du kannst nicht Daten zu einer View hinzufügen, die gar nicht existiert. und sie existiert nicht, da die Activity ja gar nicht angezeigt wurde.

Deshalb kümmere dich erstmal darum, die Daten in einer DB / einer Datei zu speichern und dann darum, dass die ListView die Daten aus der Datei anzeigt.

Liebe Grüße impjor.

Für ein gutes Miteinander: Unsere Regeln
Apps für jeden Einsatzzweck
Stellt eure App vor!

Antworten
Basti Steer
  • Forum-Beiträge: 37

07.05.2014, 13:36:33 via Website

Okay werde das jetzt so versuchen, vielen Dank an alle ;)

Antworten