lListItemView.setHeight() oder so ...

  • Antworten:3
  • Bentwortet
tomte
  • Forum-Beiträge: 36

28.01.2014, 12:32:31 via Website

In MyActivity.onCreate(...) wird u.a. ein ListAdapter erzeugt und der ListView gegeben:

mEditKriterienAdapter = new ListAdapter() {
...
__@Override
__public View getView(
________int pNodeIndex,
________View convertView,
________ViewGroup parent) {
____...
____lView = WidgetFactory.createWidget(
__________mThisActivity, // pContext,
__________...
__________lKriterienNode.getValueClass(), // pValueClass,
__________lKriterienNode.mListItemViewType, // pListItemViewType, z.B. Spinner
__________lKriterienNode.getValue(), // pListItemValue
__________...);
____return lView;
__}
...
}
mEditKriterienListView = (ListView)findViewById( R.id.editKriterienListView); // EDIT 18:58
mEditKriterienListView.setAdapter( mEditKriterienAdapter);


Die WidgetFactory liefert fuer die ListItems in Abhaengigkeit von pListItemViewType eins von z.Zt. 28 moeglichen (zusammengesetzten) Widgets, z.B. BooleanCheckbox, BooleanView, EnumSpinner, StringSpinner, StringField, StringView etc..

Das erzeugt z.B. folgende Ausgabe mit
1 BooleanCheckbox
2 GroupNodes, noch geschlossen
1 Spinner, noch geschlossen
1 GroupNode, noch geschlossen:



... und nach Aufklappen des Spinners:



Der BooleanCheckbox-Zeile "Test: V" moechte ich die gleiche Hoehe geben wie den Text-Items der Liste.

Zumindest die Spinner-Zeile "Computer-Erfahrung: Anfänger" ist mir entschieden zu hoch und soll moeglichst die gleiche Hoehe bekommen wie die Text-Items der Liste. Das kleine Auswahl-Dreieck am rechten Rand sollte moeglichst erhalten bleiben, nur hoeher rutschen.

lListItemView.setHeight( mListItemHeight) gibt es nicht.
lListItemView.setMinimumHeight( mListItemHeight) bewirkt nichts.

mListItemHeight will ich irgendwie messen an einer temmporaeren ListView, aber darueber denke ich erst weiter nach, wenn setHeight() o,ae, funktioniert.

Irgendwelche Ideen zu setHeight() - oder aehnlich?

Danke im Voraus
tomte

— geändert am 28.01.2014, 18:59:17

Antworten
Mac Systems
  • Forum-Beiträge: 1.727

28.01.2014, 17:11:28 via Website

Generell ist es nicht gut sowas im Code lösen zu wollen.

Ich würde eine Dimension schreiben und entsprechend in Styles oder im Layout direkt benutzen. Generell fehlt da noch "platz" und alles klebt links am rand

PS: Wieso "inflates" du deine Items nicht per Layout um viel mehr kontrolle zu haben ? Oder ist das in dem bsp da oben einfach nur wegoptimiert ?

— geändert am 28.01.2014, 17:13:11

Windmate HD, See you @ IO 14 , Worked on Wundercar, Glass V3, LG G Watch, Moto 360, Android TV

Antworten
tomte
  • Forum-Beiträge: 36

28.01.2014, 19:54:26 via Website

Mac Systems
Generell ist es nicht gut sowas im Code lösen zu wollen.
Da ich diesen Rat erwartet hatte und ausserdem die Optimierungsmoeglichkeit durch convertView nutzen wollte, hatte ich vorher versucht, alle 28 zusammengesetzten Widgets via XML inflaten zu lassen, z.B. so:
<RelativeLayout
__xmlns:android="http://schemas.android.com/apk/res/android"
____xmlns:tools="http://schemas.android.com/tools"
____android:orientation="vertical"
____android:layout_width="match_parent"
____android:layout_height="match_parent"
____tools:context=".EditKriterienActivity" >

__<ListView android:id="@+id/editKriterienListView"
____android:layout_width="match_parent"
____android:layout_height="match_parent"
____android:layout_above="@+id/buttonBar" >

____<LinearLayout android:id="@+id/itemLayout"
________android:orientation="horizontal"
________android:gravity="top"
________android:layout_width="match_parent"
________android:layout_height="wrap_content"
________android:layout_alignParentTop="true"
________tools:context=".EditKriterienActivity" >

______<TextView
__________android:id="@+id/levelDiffView"
__________android:layout_width="wrap_content"
__________android:layout_height="wrap_content"
__________android:layout_alignParentLeft="true"
__________android:layout_alignParentTop="true" />

______<TextView
__________android:id="@+id/promptView"
__________android:layout_width="wrap_content"
__________android:layout_height="wrap_content"
__________android:layout_alignParentLeft="true"
__________android:layout_alignParentTop="true" />

______<!-- Edit-Widget Start -->

______<TextView
__________android:id="@+id/booleanCheckbox"
__________android:layout_width="wrap_content"
__________android:layout_height="wrap_content"
__________android:visibility="gone" />

______<TextView
__________android:id="@+id/booleanView"
__________android:layout_width="wrap_content"
__________android:layout_height="wrap_content"
__________android:visibility="gone" />

______... etc etc etc ... fuer 28 Widgets! (hier testweise erstmal nur als TextViews)

Doch dann dachte ich mir, das kann doch gar nicht wahr sein, dass fuer jedes der evtl. 10 sichtbaren von 100 gespeicherten Item-Exemplare je 28 Widgets angelegt - und zwar per visibility="gone" unsichtbar angelegt - und wohl auch inflatet werden muessen, von denen aber nur das eine zu pListItemViewType passende sichtbar geschaltet wird - pro Item der Liste.

Die ListView ist per XML deklariert (siehe EDIT, das hatte ich vergessen zu posten).
Aber die 28 verschiedenen ItemViews erzeugt in der aktuellen Version die Factory am XML vorbei einfach per new ...().

Ich würde eine Dimension schreiben und entsprechend in Styles oder im Layout direkt benutzen.
Dazu muesste ich wieder die 10 * 28 Widgets per XML-Deklaration inflaten lassen, richtig? Denn selbst wenn ich die Hoehe als Dimension definiert habe, brauche ich entweder das laengliche XML oder einen Befehl wie setHeight().
Ist das hier nicht wirklich ein Fall, wo die 28 verschiedenen Widgets besser ohne XML angelegt werden?
Und muesste es fuer das Setzen der Hoehe nicht auch einen Befehl geben? Auch mein Code bildet ja nur die gleiche Struktur nach, die auch im XML steht.


Wieso "inflates" du deine Items nicht per Layout um viel mehr kontrolle zu haben ? Oder ist das in dem bsp da oben einfach nur wegoptimiert ?
Nur das Inflate fuer die Liste hatte ich vergessen zu posten.
Wieso ich die 27 unsichtbaren Item-Widgets nicht per XML inflaten moechte, habe ich weiter oben begruendet.

Antworten
tomte
  • Forum-Beiträge: 36

31.01.2014, 13:04:50 via Website

Kaum macht man's richtig, schon funktioniert's:

EnumSpinner extends ListItemEditorBase<VarEnum<?>> // LinearLayout mit LevelDiff und Prompt

ListItemEditorBase<T> extends ListItemLayoutBase<T> // T = Boolean, String, ...

ListItemLayoutBase<T> // T = type of value, like Boolean, String, Enum<?>, ...
____________extends LinearLayout { // mit LevelDiff und Prompt
...

In EditKriterienActivity.onCreate():
__createEditKriterienAdapter();
__mWidgetFactory = new WidgetFactory( mThisActivity, mEditKriterienAdapter);
____=> measureMaxListItemHeight() => mMaxListItemHeights[]
__hookupEditKriterienListView();
__hookupButtons();
...

int measureMaxListItemHeight( int pHeightMeasureSpec) { // View.MeasureSpec.UNSPECIFIED
____ListView lTempListView = (ListView)mActivity.findViewById( R.id.editKriterienListView);
____lTempListView.setAdapter( mEditKriterienAdapter);
____lTempListView.measure(
________sWidthMeasureSpec,
________pHeightMeasureSpec);
____int lListChildHeight = lTempListView.getMeasuredHeight();
________// 64, gut fuer EnumSpinner, zu hoch fuer GroupNodes
return lListChildHeight;
}

In WidgetFactory.createWidget():
__lListItemView = new EnumSpinner(
__________...,
__________pValueClass,
__________pListItemVarValue,
__________...);
__LayoutParams lOldLayoutParams = lListItemView.mListItemLayout.getLayoutParams();
__LayoutParams lLayoutParams = new LayoutParams(
__________lOldLayoutParams.width,
__________mMaxListItemHeights[ lListItemViewType.ordinal()]);
__lListItemView.mListItemLayout.setLayoutParams( lLayoutParams);

Dadurch verringert sich die Hoehe des EnumSpinners:


Die wichtigste Erkenntnis war, dass per LayoutParams die Parent-ViewGroup den ChildViews vorgibt, wie sie sich darzustellen haben - und nicht umgekehrt.
tomte

— geändert am 31.01.2014, 13:11:53

Antworten