【问题标题】:Android getView() only called for visible rows?Android getView() 只调用可见行?
【发布时间】:2011-04-27 03:24:27
【问题描述】:

我的应用程序加载了一个从远程 XML 文件填充的 ListView。第一行之后的每一行都需要在多个 http 请求中获取。

例如,XML 文件如下所示:

可用内容不可用不可用不可用不可用

据此,我创建了一个映射到适配器的 ArrayList。

在我的 GetView() 中,我检查 ArrayList 中的字符串“不可用”,如果找到,启动一个 AsyncTask,我将相应的行、位置和 URL 传递给(XML 文件中的每个项目也有一个网址值)。然后在 onPostExecute 中,我使用 row.findViewById() 和 setText() 用不可用项目的 URL 获取的新内容更新 ListView

这一切都有效,但仅适用于屏幕上可见的行。例如如果总共有 10 行,并且我一次在屏幕上看到 5 行,那么当我向下滚动到底部时,前 5 行的相同值会显示一秒钟,然后再更新为正确的值。然后当我向上滚动时会发生同样的事情。那么,有没有我可以使用的类似于 getView 并将每一行传递给 AsyncTask 的东西,但对于整个 ListView 只调用一次?

【问题讨论】:

    标签: android android-listview


    【解决方案1】:

    呃,不是这样。我会说你做对了:在 getView() 中做,但让 AsyncTask 实际上更新 ArrayList 中的项目,这样它就不会再次触发。如果您有 ArrayList 支持,您只需更改该位置的值,然后执行<adapter>.notifyDataSetChanged(); 即可更新内容。

    【讨论】:

    • 也许我做错了,但我一开始确实尝试过。每个 ArrayList 对象都是一个 HashMap。我找不到一种方法来编辑其中一个值,比如 array.get(position).get("key").setValue("new value"),所以我不得不从中删除整个 HashMap传递的位置,然后将旧值和新值重新添加到新的 HashMap 中,然后将新的 HashMap 添加到 ArrayList 中的相同位置。但是,这不起作用,条目重复并且乱序,虽然我可能在那里犯了错误,但会再次查看
    • 更容易制作一个小的自定义对象,它有 2 个字段(比如 value(一个字符串)和 fetched(一个默认为 false 的布尔值)和一个返回 value 的 toString 方法)。 aSyncTask 只是将 fetched 字段设置为 true 并更新值,并在 getView() 测试中 fetched: 它为 false,触发您的 AsyncTask。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-04
    • 2011-06-28
    • 2015-09-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多