首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Android ListView notifyDataSetChanged

Android ListView notifyDataSetChanged
EN

Stack Overflow用户
提问于 2011-09-04 20:36:35
回答 1查看 2K关注 0票数 3

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

这种方法有两个问题:

  • 所有条目都是重新创建的,而且速度很慢,这不是必需的,因为我只更新第一个条目
  • 中的文本视图,ProgressBar动画每次

都会重新启动。

所以我想我只需要在适配器中保留对first的引用,然后手动更新它。它工作正常,但它会随机抛出IllegalStateException (“适配器的内容已经更改,但ListView没有收到通知。请确保适配器的内容不是从后台线程修改的,而是从UI线程修改的。”)

我该怎么解决呢?是否有方法通知ListView只更改了第一个条目?即使有,ProgressBar动画仍然会失败。还有其他方法手动更新吗?

谢谢

EN

回答 1

Stack Overflow用户

发布于 2011-09-05 01:01:07

每当我需要更新列表视图上的单个项目时,我都会使用以下内容:

代码语言:javascript
复制
public void updateItemAt(int index) {
    View v = listView.getChildAt(index - listView.getFirstVisiblePosition());
    if (v != null) {
        //updates the view
    }
}

缺点是需要在适配器中保存对listView的引用。由于此代码通常是从后台任务调用的,因此必须使用处理程序来调用它:

代码语言:javascript
复制
Handler myHandler = new Handler() {
    public void handleMessage(Message msg) {
        int index = msg.what;
        myAdapter.updateItemAt(index);
    };
};

//when task is complete:
myHandler.sendEmptyMessage(index);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7301962

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档