我想要一个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_1
或simple_list_item_2
:
MyAdapter adapter = new MyAdapter(
this,
android.R.layout.simple_list_item_2,
myListOfListViewElements);
然后当我填充ListView时实现了这个决定:
myListView.setAdapter(adapter);
那么如何在一个ListView中使用这两种simple_list_item?
答案 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
的一部分,而是将其置于其上方或上方,以便于方便地访问;即无需首先滚动回顶部。