【问题标题】:ListView that mixes simple_list_item_1 and simple_list_item_2混合 simple_list_item_1 和 simple_list_item_2 的 ListView
【发布时间】:2012-10-31 00:13:38
【问题描述】:

我想要一个 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 呢?

【问题讨论】:

    标签: android listview android-2.2-froyo


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      对于您只处理单个“特殊”项目的特定情况,@dymmeh 的答案绝对是一种很好且易于实施的方法。对于更一般的情况,您需要处理多个不同的项目,这些项目不一定位于ListView 的顶部,您可以参考适配器中的以下两种方法:

      • getItemViewType(int position)
      • getViewTypeCount()

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

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

      关于视图类型方法的更多细节:

      附带说明:我实际上考虑不将“添加...”选项作为ListView 的一部分,而是将其放置在其顶部或上方,以便于访问;即无需先滚动回顶部。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-03-09
        • 2012-06-30
        • 2019-03-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-05-19
        • 1970-01-01
        相关资源
        最近更新 更多