可以动态更改 ListView 的适配器吗?
Posted
技术标签:
【中文标题】可以动态更改 ListView 的适配器吗?【英文标题】:Is it okay to change a ListView's adapter dynamically? 【发布时间】:2012-04-10 06:04:38 【问题描述】:我想根据需要更改ListView
的ArrayAdapter
,而不是创建多个活动。我在API 中没有看到任何关于是否可以多次致电setAdapter()
的内容。
更具体地说,假设我想启动一个具有ListView
的活动。在此示例中,ListView
使用来自CategoryArrayAdapter
的listView.setAdapter(this)
进行初始化。
然后用户选择一个类别。在不启动新活动的情况下,代码将为同一 ListView
设置新适配器。新的适配器,比如ItemArrayAdapter
调用listView.setAdapter(this)
。
是否有人有成功完成此操作的经验或知道不应该这样做的具体原因?
【问题讨论】:
【参考方案1】:我没有在 API 中看到任何关于是否可以多次调用 setAdapter() 的信息。
简单的答案是肯定的,我以前也做过类似的事情。
这正是Adapter 存在并在API 中提供的原因。每个列表项的实际内容(模型)及其呈现方式(视图)是在 android.widget.Adapter 内部隔离和实现的,而不是直接绑定到 android.widget.AdapterView。只要您的适配器正确实现,您就可以交换/更改绑定到 ListView 的实际底层适配器,只需调用 setAdapter() 方法即可。
【讨论】:
【参考方案2】:重置适配器是可以的,但请注意,这样做时可能会出现 GUI 故障,因为必须使用新数据重新绘制正在更改适配器的视图。除此之外,你应该没问题。
【讨论】:
以上是关于可以动态更改 ListView 的适配器吗?的主要内容,如果未能解决你的问题,请参考以下文章
在 ListView 适配器的 getView(...) 中更改 TextView 颜色和文本
Android,ListView IllegalStateException:“适配器的内容已更改但ListView没有收到通知”
使用自定义适配器更改 ListView 中特定行中的 ImageView