Android ListView固定高度项目

有一点问题。 我想创build一个Android列表视图的活动列表中的所有项目具有固定的高度。

所以,我的项目布局(thread_item.xml)看起来像这样:

<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="300dip" > <TextView android:id="@+id/thread_item_title" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="[dummy]" android:textSize="20dip" android:textStyle="bold" /> <ImageView android:id="@+id/thread_first_image" android:layout_below="@id/thread_item_title" android:scaleType="centerInside" android:maxWidth="100dip" android:maxHeight="100dip" android:layout_width="wrap_content" android:layout_height="wrap_content" android:adjustViewBounds="true" /> <TextView android:id="@+id/thread_item_preview" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignTop="@id/thread_first_image" android:text="[dummy]" android:textSize="15dip"> </TextView> </RelativeLayout> 

我将根元素的layout_height设置为300dip,并期望所有项目具有相同的高度,但是他们不。 当我运行应用程序时,它看起来像具有wrap_content值的高度。

另外,活动本身看起来像这样:

 public class ThreadListActivity extends ListActivity { public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); /* Code to get items from the storage. */ setListAdapter(new ThreadItemAdapter(this, R.layout.thread_item, itemsArray))); getListView().setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> adapterView, View view, int position, long id) { /*Start new Activity. Unrelated stuff.*/ } }); } } 

我正在使用的适配器如下所示:

 public class ThreadItemAdapter extends ArrayAdapter<ThreadItem> { Activity context; List<ThreadItem> items; public ThreadItemAdapter(Activity context, int textViewResourceId, List<ThreadItem> items) { super(context, textViewResourceId, items); this.context = context; this.items = items; } @Override public View getView(int position, View convertView, ViewGroup parent) { LayoutInflater inf = this.context.getLayoutInflater(); View result; if (convertView == null) { result = inf.inflate(R.layout.thread_item, null); } else { result = convertView; } TextView tbTitle = (TextView) result.findViewById(R.id.thread_item_title); TextView tbPreview = (TextView) result.findViewById(R.id.thread_item_preview); ImageView ivFirstImage = (ImageView) result.findViewById(R.id.thread_first_image); ThreadItem item = items.get(position); tbTitle.setText(item.getThreadTitle()); ivFirstImage.setImageBitmap(item.getFirstImage()); SimpleLeadingMarginSpan span = new SimpleLeadingMarginSpan(item.getFirstImage() != null ? 5 : 0, 115); // TODO: const SpannableString previewText = new SpannableString(item.getThreadPreview()); previewText.setSpan(span, 0, previewText.length(), 0); tbPreview.setText(previewText); return result; } } 

我不明白为什么所有的列表项目仍然包装他们的内容,并不保持300dip的高度。 他们可能会更小或更大,然后300dip。 我正在使用android 2.3.3,在HTC Evo 3D设备和模拟器上进行testing(两者都显示相同的结果)。

非常感谢。

UPD:

感谢Miguel和Sam。 解决scheme是将maxHeight设置为textView,这使得我的列表项目增长(这将是+id/thread_item_preview ),并将RelativeLayout的minHeight也设置为300dip,以防止它缩小。

Solutions Collecting From Web of "Android ListView固定高度项目"

如果将行中的所有子视图高度从wrap_content更改为match_parent会怎么样?


从评论

你有没有尝试minHeightmaxHeight属性? 例如:

 android:minHeight="300dp" 

您还应该观看Android的Romain Guy 讨论适配器和getView()效率 。

当为convertView充气时,而不是仅仅

 result = inf.inflate(R.layout.thread_item, null); 

 result = inf.inflate(R.layout.thread_item, parent, false); 

有问题的方法是inflater.inflate(int viewId, ViewGroup parent, boolean attachToRoot) – 因为你不尊重提供的parent (在这种情况下是ListView),无论你提供给列表视图项的任何维度将默认将其设置为layout_width = fill_parent,layout_height = wrap_content,忽略您在xml中指定的300dip高度。 通过提供父视图和传递false ,inflater将荣誉300dip高度,而不附加到根(父母)。

尝试改变这一点

 android:layout_height="300dip" 

 android:minHeight="300dip" 

这对我使用ExpandableListView,所以我想它会适用于这种情况。

您可以通过为Min和Max指定相同的尺寸来实现此目的。 这解决了我的问题。

 <ImageView android:id="@+id/appIconImageView" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentLeft="true" android:layout_alignParentTop="true" android:layout_marginBottom="8dp" android:layout_marginLeft="8dp" android:layout_marginTop="8dp" android:adjustViewBounds="true" android:maxHeight="50dp" android:maxWidth="50dp" android:minHeight="50dp" android:minWidth="50dp" android:src="@drawable/ic_launcher" /> 

在这里输入图像说明

尝试将内容TextView的高度设置为0dp ,然后将其layout_alignParentBottom设置为true

 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:minHeight="60dp" android:layout_height="match_parent" android:orientation="horizontal" android:gravity="center" android:weightSum="1" android:background="@color/main_color"> <ImageView android:id="@+id/img_left_menu" android:layout_weight="0.4" android:focusable="false" android:maxHeight="50dp" android:maxWidth="50dp" android:minHeight="50dp" android:minWidth="50dp" android:layout_width="0dp" android:scaleType="centerInside" android:adjustViewBounds="true" android:layout_height="wrap_content"/> <TextView android:id="@+id/tx_left_menu" android:layout_width="0dp" android:textSize="18dp" android:layout_gravity="center_vertical" android:layout_weight="0.6" android:singleLine="true" android:layout_height="wrap_content" android:focusable="false" /> </LinearLayout> 

如果我没有弄错,listView会自动修改一个自定义视图的LayoutParams为wrap_content,wrap_content。 但是,上面的答案是正确的,如果你设置一个minHeight或minWidth它将工作出色。