2011-09-04 63 views
3

我有一个自定义列表视图,每个条目包含旋转ProgressBar和单行textview。我总是只更新列表中的第一项。问题是每次我调用notifyDataSetChanged时,所有可见的视图都会被重新创建或作为convertView被回收。Android ListView notifyDataSetChanged

有2个问题,这种方法:

  • 所有条目重新创建,这就是慢 - 作为我的第一个条目

  • 的进度动画只更新TextView的,这不是必需的每次都重新启动

所以我尽管我会保留对适配器中的第一个视图的引用并手动更新它。它工作,但它随机抛出IllegalStateException(“适配器的内容已更改,但ListView没有收到通知。请确保您的适配器的内容不是从后台线程修改,但仅从UI线程修改。”)

我该如何解决?有没有办法通知ListView只有第一个条目改变了?即使有,ProgressBar动画仍然会失败。有没有其他的方法来手动更新它?

感谢

+0

你能证明确实更新的代码。从消息看来,您可能正在通过非UI线程更新UI(例如AsyncTask中的doInBackground()) – momo

+0

发布太复杂,但它在UI线程上。问题在于不调用notifyDataSetChanged,正如我在我的问题中解释的那样。 –

+0

我有同样的问题。我在UIThread中使用了关于列表和适配器的所有方法。但随机抛出这个异常。你如何解决它? – atasoyh

回答

0

每当我需要在一个ListView我用这个更新一个单一的项目:

public void updateItemAt(int index) { 
    View v = listView.getChildAt(index - listView.getFirstVisiblePosition()); 
    if (v != null) { 
     //updates the view 
    } 
} 

的缺点是,你需要在你的适配器来保存到ListView的参考。 因为这些代码通常是从后台任务调用,你必须使用一个处理程序来调用它:

Handler myHandler = new Handler() { 
    public void handleMessage(Message msg) { 
     int index = msg.what; 
     myAdapter.updateItemAt(index); 
    }; 
}; 

//when task is complete: 
myHandler.sendEmptyMessage(index); 
+0

请再次阅读该问题。即使从UI线程进行更改,ListView也需要调用notifyDataSetChanged。你的解决方案也会随机抛出提到的异常。 –

相关问题