2012-04-30 54 views
9

有一点问题。我想创建一个android列表视图活动,列表中的所有项目都有固定的高度。Android ListView固定高度项目

所以,我的项目布局(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 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设备和模拟器上进行测试(两者都显示相同的结果)。

非常感谢。

UPD:

由于米格尔和山姆。解决方案是将maxHeight设置为textView,这使得我的列表项目增长(这将是+id/thread_item_preview)并将RelativeLayout的minHeight也设置为300dip,以防止它缩小。

+0

如果我们将最小高度和最大高度设置为相同,那么当列表视图中文本的大小超过该高度时会发生什么? – Ashwin

回答

30

如果将所有子视图高度从wrap_content更改为match_parent,该怎么办?


从评论

你试过了minHeightmaxHeight属性?例如:

android:minHeight="300dp" 

您还应该看Android的Romain Guy discuss efficiency in adapters and getView()

+0

不,结果相同。最大的textview'id/thread_item_preview'仍然延伸RelativeLayout更大,并且如果内容需要少于300dips高度,布局本身仍然会缩小。无论如何,谢谢你的建议。 – Dmitriy

+0

Hmph,你试过'minHeight'和'maxHeight'属性吗? – Sam

+0

应该想一想,谢谢!将立即发布解决方案。 – Dmitriy

0

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

+1

在这种情况下,textview会崩溃并且不会显示任何文本。 – Dmitriy

39

膨胀的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高度,而不将其附加到根(父级)。

+0

是的,我在之前看到过那种类似于stackoverflow的答案。但在我的适配器的'getView'方法中,'parent'由于某种原因是空的。 – Dmitriy

+1

你试过了吗?当你使用超负荷的充气时,它是否会崩溃? – josephus

+0

我的不好,父母不是空的,对不起。看起来像一个重载版本也可以。谢谢。 – Dmitriy

7

尝试修改此

android:layout_height="300dip" 

android:minHeight="300dip" 

这使用ExpandableListView为我工作,所以我想它会为这种情况下工作。

+0

谢谢,这解决了两个问题之一 - 缩小列表项目,但不是增长的问题。总之,+1。 – Dmitriy

+2

好:)顺便说一下,我想我犯了一个错字。它是“android:minHeight”,而不是“android:layout_minHeight”。 –

+0

也适用于我的问题。谢谢! –

2

您可以通过为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" /> 

enter image description here

0
<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> 
0

如果我没有记错,ListView控件自动修改自定义视图的的LayoutParams为wrap_content,WRAP_CONTENT。但是,上面的答案是正确的,如果您设置了minHeight或minWidth,它将会非常出色。