有一点问题.我想创建一个
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,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,以防止它收缩.
解决方法
如果您将行中的所有子视图高度从wrap_content更改为match_parent会怎么样?
从评论
你尝试过minHeight和maxHeight属性吗?例如:
android:minHeight="300dp"
你也应该看看Android的Romain Guy discuss efficiency in adapters and getView()
.