混合了simple_list_item_1和simple_list_item_2的ListView

时间:2012-10-31 00:13:38

标签: android listview android-2.2-froyo

我想要一个ListView,它使用simple_list_item_2显示每个项目的名称和信息,所以它看起来像这样:

SWITZERLAND
a country with many delicious cheeses

BRITAIN
famous for its clocktower

AUSTRALIA
in Australia, everything is upside down!

大写字母中的文字用于表示每个ListView元素中的大黑色文本,下方大写字母表示该元素的灰色小类型。

但是,我希望用户能够添加自己的国家/地区,因此第一个元素会显示为

ADD NEW COUNTRY...

没有任何小型文字。我可以使用simple_list_item_2,只需将小文本设置为"",但这会使大文本难以对齐。我希望这个特殊的“添加新国家/地区”元素看起来与simple_list_item_1完全相同。

但是,在我的适配器初始化中决定使用simple_list_item_1simple_list_item_2

MyAdapter adapter = new MyAdapter(
            this,
            android.R.layout.simple_list_item_2, 
            myListOfListViewElements);

然后当我填充ListView时实现了这个决定:

myListView.setAdapter(adapter);

那么如何在一个ListView中使用这两种simple_list_item?

2 个答案:

答案 0 :(得分:0)

在致电addHeaderView(View view) / ListView之前,您可以在setAdapter(adapter)上致电setListAdapter(adapter),始终将“添加新国家/地区”视为标题视图。将onClick侦听器附加到该标头视图以捕获任何单击

这样,您的“添加新国家/地区”将显示为列表视图中的第一个条目

答案 1 :(得分:0)

对于您只处理一个“特殊”项目的特定情况,@ dymmeh的答案肯定是一个好的且易于实现的方法。对于更通用的情况,您需要处理多个不一定位于ListView顶部的不同项,您可以在适配器中引用以下两种方法:

  • getItemViewType(int position)
  • getViewTypeCount()

根据第一种方法的返回值,Android会在适配器的convertView方法中为您提供所需的getView(...)。一种常见的方法是简单地将布局ID作为类型返回(例如R.layout.row_layout),但您可以真正使用您喜欢的任何内容,前提是值唯一标识类型。

之后,在构建ViewHolder / RowWrapper时,您需要做一些额外的工作来扩充正确的布局。对于每种视图类型,如果convertView == null,您需要选择正确的布局。将至少有一种视图类型(默认情况下),最多只有getViewTypeCount()An example illustrating the idea can be found here

有关视图类型方法的更多详细信息:

旁注:我实际上考虑不将{add ...'选项作为ListView的一部分,而是将其置于其上方或上方,以便于方便地访问;即无需首先滚动回顶部。