带有过滤器的Listview将不会刷新,直到键盘被隐藏或按下返回

时间:2014-04-20 16:40:03

标签: android listview filter

我有一个列表视图,显示联系人列表。我在listview上方的布局中添加了EditText,因此我可以使用Filter进行搜索。我使用EditText上的onTextChanged Listener实现了这个。我的listview适配器是一个自定义适配器,它扩展了BaseAdapter并实现了Filterable。我的过滤器可以正常工作。问题是,在我打字时,数据集会刷新,但列表视图本身不会刷新,直到我隐藏键盘或按返回键。如果我在EditText中输入一些文本后尝试点击列表视图但在关闭键盘或按回车之前,我收到此错误:

java.lang.IllegalStateException: The content of the adapter has changed 
but ListView did not receive a notification. Make sure the content of 
your adapter is not modified from a background thread, but only from the UI thread.

现在我绝对不会从UI线程以外的线程修改适配器的内容。

有人可以解释可能导致此问题的原因吗?

实际上,我通过致电Activity.onContentChanged()找到了解决方法,但我仍然很好奇为什么我实际上需要手动刷新。

3 个答案:

答案 0 :(得分:6)

我终于找到了办法。问题是,当我调用notifyDataSetChanged();时数据集很新,但是视图没有重新绘制,我不知道为什么(可能与我使用ViewHolder模式有关吗?只是一个随机的猜测...)。所以我所做的就是调用getListView().invalidateViews();,并使用正确的数据重新绘制视图。

答案 1 :(得分:1)

我有一些问题,我尝试了很多没有好结果的解决方案。

我通过在我的活动的清单文件中添加android:hardwareAccelerated="true"解决了这个问题。

尝试使用此解决方案,它可以帮助您

答案 2 :(得分:0)

你可以使用setNotifyOnChange()自动调用notifyDataSetChanged()。它实际上通知附加的观察者基础数据已被更改,反映数据集的任何视图都应该自行刷新。