安卓ICS ListView刷新问题

6
我在我的Android应用程序上有一个ListView,我动态地更改其数据。我使用onFilterComplete()方法来更改ListView的内容。
在冰淇淋三明治之前,以下代码运行良好:
if(adapter != null) {

  adapter.notifyDataSetInvalidated();
  lview3.invalidateViews();

  adapter.getFilter().filter(aa1.getItem(item), new Filter.FilterListener() {
  public void onFilterComplete(int count) {
    adapter.notifyDataSetChanged();

    if(lview3.getCount() == 0){
      lview3.setVisibility(View.GONE);                                     
    }
    else{
      lview3.setVisibility(View.VISIBLE);
    }
}});

然而,在Ice Cream Sandwich上使用过滤器时,屏幕无法正确地刷新。如果过滤器返回的条目数小于之前的ListView,则旧列表数据似乎仍然可见于背景中,如此屏幕截图所示:
从屏幕截图中可以看到ListView中的第一个条目的位置,这就是唯一可见的内容。您可以看到先前的结果仍然可见于其下方,它们只是可见的,不能被点击,就好像屏幕没有得到正确的刷新。
当我选择主屏幕上的主页按钮离开应用程序并返回时,一切都显示正常,如下面的屏幕截图所示:
在Ice Cream Sandwich上,是否还需要实现其他内容来正确刷新ListView?是否有其他人遇到类似的问题?
我的代码在ICS之前运行良好。

当你说“旧的ListView”时,你真正指的是适配器中的旧数据,对吗?或者有多个ListView重叠在一起吗? - Jason Robinson
抱歉,是的,我指的是适配器中的最后一个过滤数据。布局中只有一个ListView,代码中也只有一个,没有多个。当我离开屏幕并返回时,ListView会像第二张截图中显示的那样出现。 - Donal Rafferty
在我看来,过滤器应该已经在适配器上调用了datasetChanged,所以你可能不需要这样做。我不知道这是否可以解释你的问题,但值得注释并尝试一下。 - Pedro Loureiro
你能解释一下为什么你有两个适配器吗?ArrayAdapter aa1 和一个字段 adapter。它的类是什么? - Pedro Loureiro
你分配给ListView的适配器是哪一个?我原以为是adapter字段,但现在不太确定了。 - Pedro Loureiro
显示剩余2条评论
1个回答

0
为了解决这个问题,我将我的代码更改为以下内容:
if(adapter != null) {
  adapter.getFilter().filter(aa1.getItem(item), new Filter.FilterListener() {
  public void onFilterComplete(int count) {
    adapter.notifyDataSetChanged();

    if(lview3.getCount() == 0){
      lview3.setVisibility(View.GONE);                                     
    }
    else{
      lview3.setVisibility(View.VISIBLE);
      decLayout.invalidate();
    }
}});

decLayout是我的列表视图所在的相对布局,当列表视图数据发生变化时,它似乎可以正确地刷新屏幕。

虽然这个方法有效,但我并不确定它是否是一个有效的解决方案,我想听听其他遇到类似问题并可能有适当解决方案的人的意见。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接