在 Android 中高效处理动态列表视图项

Posted

技术标签:

【中文标题】在 Android 中高效处理动态列表视图项【英文标题】:Processing dynamic list view items efficiently in Android 【发布时间】:2014-09-07 19:04:49 【问题描述】:

在我的应用程序中,我有一个名为“联系人”的按钮,允许用户选择联系人以添加到他或她的朋友列表中。单击时,用户会看到所有用户联系人的列表视图。每个列表视图行都包含联系人显示名称、图标、电子邮件地址和一个按钮。名称、图标和电子邮件均使用 ContactsContract 类获取。

我遇到的问题是处理所有用户的联系人在计算上非常昂贵。

我尝试了两种解决方案:

    CursorAdapter 中,我尝试修改bindView 方法。我传入了一个查询用户联系人的游标,在bindView 方法中,我对我的服务器执行了一个异步调用,以将联系人的关系返回给当前用户。即,如果联系人安装了应用程序并且是朋友,则该按钮将显示“删除”。此调用将确定按钮类型并设置适当的onClickListeners

    这不起作用,因为它会导致列表非常缓慢、不流畅并且感觉非常滞后。

    我只是尝试在一些不同的线程中加载联系人和服务器查询。当它完成加载时,我会使用已经在不同线程中确定的名称、图标、电子邮件和按钮类型来初始化 BaseAdapter

    这不起作用,因为加载联系人需要 30 - 40 秒。不过,加载完成后就流畅多了。

如何解决这个问题?

我应该先从服务器获取数据还是为适配器中的每个项目预加载数据?

编辑:

布局看起来类似

【问题讨论】:

【参考方案1】:

我要做的是加载联系人和远程数据,创建一个自定义类来保存它们,把它放在ArrayList<MyCustomContactClass> 中,只有在一切准备就绪后,我才会将适配器加载到列表视图中。

【讨论】:

感谢您的回答!我尝试了类似的东西。当我迭代联系人时,我会获得每个联系人的远程数据。我有一个 ArrayList ,它具有图标、名称、电子邮件、按钮类型(按钮类型由远程调用的每次迭代确定)。这需要 30-40 秒。你能不能说得更详细一点? 我认为瓶颈是网络数据库拉动,对吗?如果服务器返回联系人详细信息的时间过长,我们必须找出为什么需要这么长时间。如果您不能加快服务器响应速度,也许您可​​以抓取一大堆联系人,比如说 20 个联系人,加载他们的信息,向用户展示以让他在加载其余联系人服务器信息时保持“娱乐”。要记住的其他情况是您正在加载的那些图像,我认为您应该在单独的 assynctask 中加载它们,在您的列表视图中加载联系人之后,也许图像是问题。 是的。我也许可以加快数据库的速度,但这可能还不够。我可以加载前 20 个联系人,但我可能会遇到同样的问题。如果我要搜索或执行快速滚动,它不会很流畅。我还会检查图像是否没有问题,但我怀疑它们是。 在显示列表之前是否等待图像加载? 嗯,我认为我们已经隔离了问题,如果我理解正确,对于每个联系人,您从应用程序发出服务器请求以确定其信息?如果是这种情况,请尝试一次从服务器中提取您需要的所有信息。或许将联系人数组发送到服务器,并取回完整的联系人信息数组。

以上是关于在 Android 中高效处理动态列表视图项的主要内容,如果未能解决你的问题,请参考以下文章

如何在android中动态创建列?

在列表视图项中动态设置图像视图很慢

从 jQuery 移动列表视图中动态删除列表项的刷新问题

如何使用在列表项单击时动态生成的文本视图标签突出显示我在列表视图中的当前位置

在 Android 中加载动态项目时无法将页脚视图添加到列表视图

如何在单击 oracle apex 中的每个列表视图项时显示动态模型内容?