Listview zeigt nur das Erste Element an

  • 11 Antworten
  • Letztes Antwortdatum
A

Antek

Neues Mitglied
1
Liebe Leute,

ich habe meine Activity von ListActivity abgeleitet. Das Layout sieht wie folgt aus:

Code:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
  xmlns:android="http://schemas.android.com/apk/res/android"
  android:orientation="vertical"
  android:layout_width="match_parent"
  android:layout_height="match_parent">
 
  <!-- Screen Design fuer Vereine -->
  <ListView 
            android:id="@android:id/list"
              android:text="Vereine hier"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content">
  </ListView>
 
</LinearLayout>
Der code wie folgt:
Code:
    /**
     * Zeigt die Vereine in einer Liste an.
     */
    private void zeigeVereine(){
        // Vereine aus Datenbank lesen und in Array packen
        String[] lVereineDaten = leseVereine(); 
        
        // Listadapter erstellen und setzen
        ListAdapter lVereineAdapter = new ArrayAdapter<String>(getApplicationContext(), android.R.layout.simple_list_item_1,lVereineDaten);

        //setListAdapter(lVereineAdapter);        

        ListView lv = getListView();
        lv.setAdapter(lVereineAdapter);
    }
Im Array lVereineDaten ist definitiv mehr als ein Element enthalten, trotzdem wird immer nur das erste anzeigt auf meinem Emulator. Habt Ihr eine Idee woran das liegen könnte? Irgendwo habe ich gelesen, dass Scrollviews und Listeviews sich nicht vertragen, aber eine Scrollview ist hier nicht im Spiel. Ansonsten habe ich beim Googlen keine Lösung finden können.

Gruß
Andreas
 
Teste mal die Zeile
Code:
android:layout_height="wrap_content"
zu ändern in
Code:
android:layout_height="fill_parent"
.

wrap_content bei einer listview ist nicht so toll.
 
Danke für Deine Antwort,

android:layout_height="fill_parent"
... hat leider nicht geholfen.

Gruß
Andreas
 
Öhm, entweder stehe ich auf dem Schlauch oder du machst es doppelt gemoppelt.
Du schreibst, dass du eine ListActivity hast. Danach aber, dass dein Layout auch nochmal ein ListView enthält. Somit hättest du doch zwei.. oder? :O

Also entder du hast eine Activity und setzt im Layout ein ListView oder du machst eine ListActivity, dann hast du aber ein Layout...

Gruß
 
Ach natürlich das hab ich garnicht gesehen. Das klingt doch nach einem guten Ansatz.
 
Hallo zusammen,

es will und will nicht klappen, ich hab jetzt beide Varianten ausprobiert, einmal von ListActivity abgeleitet, einmal von Activity. Für Letzteres hier mal der Code.

Activity Klasse:

Code:
package de.dreasoft.bltab;

import java.util.ArrayList;
import java.util.Iterator;

import android.app.Activity;
import android.os.Bundle;
import android.widget.ArrayAdapter;
import android.widget.ListAdapter;
import android.widget.ListView;
import de.dreasoft.bltab.db.access.BTVereinAccess;
import de.dreasoft.bltab.db.model.BTVereinDO;

public class BLVereineActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.vereine);
        setTitle(R.string.lb_tab_vereine);
        
        // Vereine auflisten
        zeigeVereine();
    }
    
    /**
     * Zeigt die Vereine in einer Liste an.
     */
    private void zeigeVereine(){
        // Vereine aus Datenbank lesen und in Array packen
        String[] lVereineDaten = leseVereine(); 
        
        // Listadapter erstellen und setzen
        ListAdapter lVereineAdapter = new ArrayAdapter<String>(getApplicationContext(), android.R.layout.simple_list_item_1,lVereineDaten);

        // View suchen und Adapter setzen
        final ListView lv = (ListView)findViewById(R.id.listView1);
        lv.setAdapter(lVereineAdapter);
    }

    /**
     * Liest die Vereine aus der Datenbank lesen
     * 
     * @return
     */
    private String[] leseVereine() {
        BTVereinAccess lBTVereinAccess = new BTVereinAccess(BLTabMainActivity.getDBConnection());
        
        ArrayList<BTVereinDO> lVereinsListe = lBTVereinAccess.selectAll();
        
        String[] lVereinsArray = new String[lVereinsListe.size()];
        int i=0;
        
        // Array mit Werten fuellen.
        for (Iterator lIterator = lVereinsListe.iterator(); lIterator.hasNext(); i++) {
            BTVereinDO lNextVereinDO = (BTVereinDO) lIterator.next();
            lVereinsArray[i] = lNextVereinDO.getName();
        }

        return lVereinsArray;
    }
}
Layout:
Code:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
  xmlns:android="http://schemas.android.com/apk/res/android"
  android:orientation="vertical"
  android:layout_width="match_parent"
  android:layout_height="match_parent">
 
  <!-- Screen Design fuer Vereine   -->
  <ListView 
            android:id="@+id/listView1"
              android:text="Vereine hier"
            android:layout_width="wrap_content"
            android:layout_height="fill_parent">
  </ListView>

</LinearLayout>
Dazu sei noch gesagt, dass die BLVereineActivity eine von dreien ist, die ich über eine HauptActivity BLTabMainActivity einbinde als TabSpec.

so sieht BLVereineActivity aus
Code:
package de.dreasoft.bltab;

import android.app.TabActivity;
import android.content.Intent;
import android.os.Bundle;
import android.view.Menu;
import android.widget.TabHost;
import android.widget.TabHost.TabSpec;
import de.dreasoft.bltab.db.BLTabDatenbank;
import de.dreasoft.bltab.db.table.InsertStammdaten;

public class BLTabMainActivity extends TabActivity {
    /*
     * Statische Referenz auf die Datenbank
     */
    private static BLTabDatenbank db = null;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        
        // Datenbank anlegen
        db =  new BLTabDatenbank(this);
        
        setContentView(R.layout.activity_bltab);
        
        TabHost lTabHost = getTabHost();
        
        /** 
         * Vereine Tab
         */
        TabSpec lVereineSpec = lTabHost.newTabSpec("VEREINE");
        
        // Titel setzen
        lVereineSpec.setIndicator("Vereine");
        Intent lVereineIntent = new Intent(this,BLVereineActivity.class);
        lVereineSpec.setContent(lVereineIntent);
        
        /**
         *  Tabelle Tab
         */
        TabSpec lTabelleSpec = lTabHost.newTabSpec("TABELLE");
        
        // Titel setzen
        lTabelleSpec.setIndicator("Tabelle");
        Intent lTabelleIntent = new Intent(this,BLTabelleActivity.class);
        lTabelleSpec.setContent(lTabelleIntent);

        /** 
         * Tabelle Tab
         */
        TabSpec lSpieltageSpec = lTabHost.newTabSpec("Spieltage");
        
        // Titel setzen
        lSpieltageSpec.setIndicator("Spieltage");
        Intent lSpieltageIntent = new Intent(this,BLSpieltageActivity.class);
        lSpieltageSpec.setContent(lSpieltageIntent);

        // Stammdaten (Vereine, Spieltage, usw. ...) einfuegen
        InsertStammdaten lInsert =new InsertStammdaten();
        lInsert.insertStammdaten();

        // Tabs hinzufuegen 
        lTabHost.addTab(lVereineSpec);
        lTabHost.addTab(lTabelleSpec);
        lTabHost.addTab(lSpieltageSpec);
        
        // Stammdaten einfuegen
    }


    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.bltab, menu);
        return true;
    }
    
    /**
     * 
     * @return
     */
    public static BLTabDatenbank getDBConnection(){
        if (db == null){
            throw new RuntimeException("Datenbank nicht initialisiert");
        }
        
        return db;
    }
}
und so das passende Layout:
Code:
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >

<TabHost 
    android:id="@android:id/tabhost"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content">
    <LinearLayout
        android:orientation="vertical"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent">
        <TabWidget
            android:id="@android:id/tabs"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content" />
        <FrameLayout
            android:id="@android:id/tabcontent"
            android:layout_width="fill_parent"
            android:layout_height="fill_parent"/>
    </LinearLayout>
</TabHost>
</ScrollView>
Habt Ihr weitere Ideen?

Gruß
Andreas
 
Hi

int i=0;

// Array mit Werten fuellen.
for (Iterator lIterator = lVereinsListe.iterator(); lIterator.hasNext(); i++) {
BTVereinDO lNextVereinDO = (BTVereinDO) lIterator.next();
lVereinsArray = lNextVereinDO.getName();
}

Hast du hier schon mal geloggt, ob das wirklich so funktioniet?
Werden tatsächlich daten ins Array geladen?!
 
IceClaw schrieb:
Hi


Hast du hier schon mal geloggt, ob das wirklich so funktioniet?
Werden tatsächlich daten ins Array geladen?!

Definitiv, da komme Sätze aus der Datenbank. Ich habe testhalber auch schon mal eine Liste von Hand mit einfachen String angelegt und in den Adapter geschickt. Auch da wird immer nur der erste Eintrag angezeigt.

Gruß
Andreas
 
warum benutzt du du nicht ein cursoradapter
 
pjack schrieb:
warum benutzt du du nicht ein cursoradapter

Du meinst weil ich Daten aus einer Datenbank lese?

Gruß
Andreas
 
Hast du schon mal geschaut, ob deine ListView wirklich gross genug ist? Klingt so, als wäre sie genau so gross, wie der erste Eintrag, weshalb du dann die anderen nicht siehst. Hat JustinTime schon indirekt angedeutet, und da du sagst, dass selbst nach manuellem befüllen des Arrays derselbe Fehler auftritt, schliesse ich mal dort die Fehlerquelle aus.

Übrigens kannst du dir das füllen des Arrays über den Iterator sparen:

Code:
String[] lVereinsArray = lVereinsListe.toArray(new String[0]);

und wenn du das doch lieber selber machen willst, würde ich diesen Weg empfehlen:

Code:
for(BTVereinDO lNextVereinDO : lVereinsListe) {
    lVereinsArray[i] = lNextVereinDO.getName();
}

Das spart das gecaste und das Iterator-Handling
 
Zuletzt bearbeitet:
Oh man oh man oh man, ich habe im Layout der Mainactivity folgendes für die dort definierte Scrollview gesetzt:

android:fillViewport="true"

dann hat es funktioniert, d.h. jetzt werden alle Listeneinträge angezeigt. Man, wegen so einer Kleinigkeit.

@Zoopa: Kann ich denn auch eine absolute Größe einer Listview angeben, oder was meinst Du genau?

Ganz zufrieden bin ich allerdings noch nicht, da ich von der depricated gesetzten Activity TabActivity ableite. Wie wäre denn das Standardvorgehen zu Erstellung von Tabs ohne die TabActivity?

Gruß
Andreas
 
Zurück
Oben Unten