ListView in die Höhe automatisch anpassen

T

theAydinator

Neues Mitglied
0
Hallo,

bei meiner Recherche bin auf unzählinge ähnliche Skrips gestoßen, welches auch fast richtig funktioniert.

Code:
public static void getTotalHeightofListView(ListView listView) {

        ListAdapter mAdapter = listView.getAdapter();

        int totalHeight = 0;

        for (int i = 0; i < mAdapter.getCount(); i++) {
            View mView = mAdapter.getView(i, null, listView);

            mView.measure(
                    MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED),

                    MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED));

            totalHeight += mView.getMeasuredHeight();
            Log.w("HEIGHT" + i, String.valueOf(totalHeight));

        }

        ViewGroup.LayoutParams params = listView.getLayoutParams();
        params.height = totalHeight
                + (listView.getDividerHeight() * (mAdapter.getCount() - 1));
        listView.setLayoutParams(params);
        listView.requestLayout();
    }

list_item.xml
Code:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="horizontal" >
    
    <TextView
        android:id="@+id/list_item_titel"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
           android:background="@color/white"
        android:textSize="14sp"
        android:paddingTop="12dp"
        android:paddingBottom="12dp"
        android:paddingLeft="10dp"
        android:paddingRight="10dp"
        android:text="Bittgebet"
        android:gravity="center_vertical"
        android:textColor="@color/list_item_text_color"
        android:fontFamily="sans-serif-light" />

</LinearLayout>

Ich habe Datensätze, die etwas länger sind und auch mal zwei Zeilen beanspruchen können.
Bei den Listen, wo es ein oder mehrere Listeneinträge zweizeilig sind, wird die Liste am Ende um paar px kürzer.

Wie könnte ich dieses Problem lösen?
Jemand eine Idee?

Würde mich über eine Rückmeldung sehr freuen.

Danke
Aydin
 
du willst etwas zur listview wissen, hast aber die xml für eine Zeile in der listview gepostet ;) zeig mal deine xml, die die listview enthält

Irgendwie ist mir auch nicht klar, was genau du mit "ein paar px weniger" meinst. Die Listview ist doch scrollbar und von daher sollte die höhe doch egal sein bzw. wird von ihrem container bestimmt ?

ich mach das bei meinen Listen meist so:
Code:
<"Master-Layoutcontainer"                   <--- z.b. auch ein Linearlayout
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <LinearLayout                                <--- "Container" für die liste
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1">

        <ListView
            android:id="@+id/liste"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"/>
    </LinearLayout>

    <andereElemente, z.b. Button, TextView, o.ä />

</"Master-Layoutcontainer">

hoffe, das hilft dir weiter ?
 
  • Danke
Reaktionen: theAydinator
zumafx schrieb:
du willst etwas zur listview wissen, hast aber die xml für eine Zeile in der listview gepostet ;) zeig mal deine xml, die die listview enthält

Irgendwie ist mir auch nicht klar, was genau du mit "ein paar px weniger" meinst. Die Listview ist doch scrollbar und von daher sollte die höhe doch egal sein bzw. wird von ihrem container bestimmt ?

ich mach das bei meinen Listen meist so:
Code:
<"Master-Layoutcontainer"                   <--- z.b. auch ein Linearlayout
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <LinearLayout                                <--- "Container" für die liste
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1">

        <ListView
            android:id="@+id/liste"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"/>
    </LinearLayout>

    <andereElemente, z.b. Button, TextView, o.ä />

</"Master-Layoutcontainer">
hoffe, das hilft dir weiter ?

Ok, sorry. Ich habe zu wenig verraten.

Ich habe mehrere Fragments, in jeder dieser Fragments ist mindestens eine Listview (max. 10).
Also ich habe eine Scrollpage mit mehreren Listviews.

Die listviews werden wie folgt generiert.

Code:
@SuppressWarnings("deprecation")
    private void showList(int unterkategorie_id, View view) {

        dbHelper = new DatabaseAdapter(getActivity());
        dbHelper.open();
        
            LinearLayout ll_fragm = (LinearLayout) view.findViewById(R.id.ll_fragment);        

            // LISTE        
            ListView listview = new ListView(getActivity());
            
                LinearLayout.LayoutParams params_lv = new LinearLayout.LayoutParams(
                                                                LayoutParams.FILL_PARENT,
                                                                LayoutParams.WRAP_CONTENT);
                params_lv.setMargins(25, 10, 0, 15);
                listview.setLayoutParams(params_lv);
                
                listview.setBackgroundResource(R.color.list_bg);
            
                ArrayList<Kapitel> hisnulmuslim_kapitel = dbHelper.getBittgebeteNachUnterkategorie(unterkategorie_id);
                
                CustomAdapter adapter = new CustomAdapter(getActivity(),
                        listview.getId(),
                        hisnulmuslim_kapitel);
                
                listview.setAdapter(adapter);
                getTotalHeightofListView(listview);
                
            ll_fragm.addView(listview);

            listview.setOnItemClickListener(new OnItemClickListener() {
                @SuppressLint("NewApi") public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                    
                    Kapitel kapitel = (Kapitel) parent.getItemAtPosition(position);
                    
                    intent = new Intent(getActivity(), SingleView.class);

                    intent.putExtra("id", kapitel.getId());
                    intent.putExtra("kategorie", kapitel.getKategorie());
                    intent.putExtra("unterkategorie", kapitel.getUnterkategorie());
                    intent.putExtra("titel", kapitel.getTitel());
                    
                    Bundle bndlanimation = ActivityOptions.makeCustomAnimation(getActivity(), R.anim.animation,R.anim.animation2).toBundle();
                    
                    getActivity().startActivity(intent , bndlanimation);
                }
            });

        dbHelper.close();
    }
Und unter onCreateView rufe ich die Methode auf:
Code:
showList(1, rootView);
 
sieht soweit für mich alles richtig aus.
was genau meinst du denn mit "wird die Liste am Ende um paar px kürzer" ?

Sind diese "paar px" evtl. die DividerHeight() ?
in dem Fall würde ich mal tippen, das je Zeile ein Divider eingefügt wird,
du aber mit

Code:
(listView.getDividerHeight() * (mAdapter.getCount() - 1));

die Gesamthöhe der Divider um einen zu wenig berechnest. (z.B. 10 Einträge, also auch 10 Divider-höhen (du rechnest aber 9 durch dein -1)

Ansonsten sehe ich da nix "falsches". Falls das an den Fagments liegt - die benutze ich nicht und hab daher da "keine Ahnung".

Wie gesagt, ich hab aber auch noch immer nicht verstanden, was du mit
"wird die Liste am Ende um paar px kürzer" meinst.
 
  • Danke
Reaktionen: theAydinator
zumafx schrieb:
sieht soweit für mich alles richtig aus.
was genau meinst du denn mit "wird die Liste am Ende um paar px kürzer" ?

Sind diese "paar px" evtl. die DividerHeight() ?
in dem Fall würde ich mal tippen, das je Zeile ein Divider eingefügt wird,
du aber mit

Code:
(listView.getDividerHeight() * (mAdapter.getCount() - 1));
die Gesamthöhe der Divider um einen zu wenig berechnest. (z.B. 10 Einträge, also auch 10 Divider-höhen (du rechnest aber 9 durch dein -1)

Ansonsten sehe ich da nix "falsches". Falls das an den Fagments liegt - die benutze ich nicht und hab daher da "keine Ahnung".

Wie gesagt, ich hab aber auch noch immer nicht verstanden, was du mit
"wird die Liste am Ende um paar px kürzer" meinst.

Siehe folgendes Bild:
https://www.dropbox.com/s/qpon5ttg3vyhpxs/_20150310_145127.JPG?dl=0

Die Höhe der ersten Liste stimmt nicht ganz, weil diese Liste einen Zweizeiler hat.
Die zweite Liste ist perfekt, so sollte es sein.

Klar, wenn ich das Handy in Querformat nehme, dann stimmt es auch.
Aber ich brauche es auch in Hochformat.
 
das problem ist nciht das die liste kürzer wird sondern das dein text bei 2 zeilen trotzdem in der mitte der textview anfängt...das sieht man doch sofort ^^

ich sehe da zwei möglichkeiten entweder die zeile bei 1/3 von oben gesehen anfangen die nächste bei 2/3 oder die view die zwei zeilen enthalten um 60-80% zu verlängern
 
  • Danke
Reaktionen: theAydinator
die View verlängern oder auch irgendwelche 3tel-Berechnungen bringen doch nichts. Sobald mal ein noch längerer Text drin ist, tritt das wieder auf.

Ich würde eher gucken, das ich die Fragmente mit entsprechenden Layout parametern anpasse/vergrößere.
Wie sind die Layoutparametern bei deinem "LinearLayout ll_fragm = (LinearLayout) view.findViewById(R.id.ll_fragment);" denn ? Irgendwelche Padding/Margins gesetzt bzw. mal mit gespielt ?
 
  • Danke
Reaktionen: theAydinator
Danke für die Tipps.
Ich verstehe nicht ganz, was man mit dem "View spielerei" gemeint ist, sorry.

fragment_1.xml
Code:
<?xml version="1.0" encoding="utf-8"?>
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:fillViewport="true" >

    <LinearLayout
        android:id="@+id/ll_fragment"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical"
        android:background="@color/farbe_1"
        android:paddingBottom="6dp" >

    </LinearLayout>

</ScrollView>
 
er meint try and error

experimentiere bis es klappt :)
 
  • Danke
Reaktionen: theAydinator
theAydinator schrieb:
Danke für die Tipps.
Ich verstehe nicht ganz, was man mit dem "View spielerei" gemeint ist, sorry.

Wie Jaiel schon sagte: Einfach mal ein wenig ausprobieren, das ist nicht nur
einfach "TrialandError" sondern man lernt dadurch auch, was welcher Parameter macht.
In deinem Beispiel tippe ich mal auf margin_bottom-setzen (z.b. 5dp), da
du ja schon ein padding drin hast.

lg
zuma
 

Ähnliche Themen

A
Antworten
10
Aufrufe
1.017
swa00
swa00
Laser5001
  • Laser5001
Antworten
2
Aufrufe
897
Laser5001
Laser5001
J
  • JoEntwickler
Antworten
0
Aufrufe
972
JoEntwickler
J
Zurück
Oben Unten