可以动态更改 ListView 的适配器吗?

Posted

技术标签:

【中文标题】可以动态更改 ListView 的适配器吗?【英文标题】:Is it okay to change a ListView's adapter dynamically? 【发布时间】:2012-04-10 06:04:38 【问题描述】:

我想根据需要更改ListViewArrayAdapter,而不是创建多个活动。我在API 中没有看到任何关于是否可以多次致电setAdapter() 的内容。

更具体地说,假设我想启动一个具有ListView 的活动。在此示例中,ListView 使用来自CategoryArrayAdapterlistView.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 颜色和文本

如何动态刷新 ListView?

Android,ListView IllegalStateException:“适配器的内容已更改但ListView没有收到通知”

使用自定义适配器更改 ListView 中特定行中的 ImageView

使用自定义适配器更改ListView中特定行中的ImageView

Android:使用 parsequery 适配器在 listview 中更改 imageview 的图像