Android ListView notifyDataSetChanged

Android ListView notifyDataSetChanged,android,listview,progress-bar,adapter,Android,Listview,Progress Bar,Adapter,我有一个自定义的listview,每个条目都包含旋转的ProgressBar和单行textview。我总是只更新列表中的第一项。问题是每次调用notifyDataSetChanged时,所有可见视图都会重新创建或作为convertView回收 这种方法有两个问题: 所有条目都会被重新创建,这很慢——这不是必需的,因为我只更新第一个条目中的textview ProgressBar动画每次都会重新启动 所以我认为我只需要在适配器中保留对第一个视图的引用并手动更新它。它工作正常,但随机抛出Ille

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

这种方法有两个问题:

  • 所有条目都会被重新创建,这很慢——这不是必需的,因为我只更新第一个条目中的textview

  • ProgressBar动画每次都会重新启动

所以我认为我只需要在适配器中保留对第一个视图的引用并手动更新它。它工作正常,但随机抛出IllegalStateException(“适配器的内容已更改,但ListView未收到通知。请确保适配器的内容未从后台线程修改,而仅从UI线程修改。”)

我如何解决它?有没有办法通知ListView只有第一个条目发生了更改?即使存在,ProgressBar动画仍将失败。是否有其他手动更新的方法


谢谢

每当我需要更新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);

您能否显示执行更新的代码。从消息中可以看出,您可能正在通过非UI线程(如AsyncTask中的doInBackground())更新UI,这太复杂了,无法发布,但它位于UI线程上。问题在于没有调用notifyDataSetChanged,正如我在问题中解释的那样。我也有同样的问题。我在UIThread中使用了有关list和adapter的所有方法。但是随机抛出这个异常。你是怎么解决的?请把问题再读一遍。ListView要求调用notifyDataSetChanged,即使从UI线程进行了更改。您的解决方案也将随机抛出提到的异常。