Do not you hate when everyone is trying to tell you that you should not do this, and not just answer your question? The ability to dynamically generate content is critical to the flexibility of the application, I fully know what you need.
This will work if all the items in the ListView are about the same height (inapplicable parts are omitted). The order is important, try to save it as I pointed out:
import android.view.ViewGroup.OnHierarchyChangeListener; public class ListPreferences extends Preference implements OnCheckedChangeListener, OnHierarchyChangeListener { private ListView listView; private View thisView; private int listHeight = 0; @Override protected View onCreateView(ViewGroup parent) { this.setLayoutResource(R.layout.listview_preference_layout); thisView = super.onCreateView(parent); listView = (ListView) thisView.findViewById(android.R.id.list); listView.setOnHierarchyChangeListener(this); String[] contentString = new String[3]; if (getKey().equals("theme")) { contentString = new String[] { (getContext().getString(R.string.settings_theme_default)), (getContext().getString(R.string.settings_theme_black)), (getContext().getString(R.string.settings_theme_white)) }; } else { contentString = new String[] { (getContext().getString(R.string.settings_font_big)), (getContext().getString(R.string.settings_font_medium)), (getContext().getString(R.string.settings_font_little)) }; } ArrayAdapter<String> array = new ArrayAdapter<String>(getContext(), android.R.layout.simple_list_item_single_choice, android.R.id.text1, contentString); listView.setAdapter(array); listView.setChoiceMode(ListView.CHOICE_MODE_SINGLE); return thisView; } public void onChildViewAdded(View parent, View child) { int childHeight = child.getMeasuredHeight(); if(childHeight > 0) { listHeight = listView.getAdapter().getCount() * childHeight; thisView.setMinimumHeight(listHeight); Log.i(TAG,"onChildViewAdded, done: "+listHeight+" "+childHeight); } } public void onChildViewRemoved(View parent, View child) { } }
You will also need res / layout / listview_preference_layout.xml with the following:
<?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:layout_gravity="fill_vertical|fill_horizontal|fill" android:gravity="fill" android:orientation="vertical" > <ListView android:id="@android:id/list" android:layout_width="fill_parent" android:layout_height="0dip" android:clipChildren="true" android:isScrollContainer="true" android:layout_gravity="fill_vertical|fill_horizontal|fill" android:layout_weight="1" android:choiceMode="singleChoice"/> </LinearLayout
source share