【问题标题】:ListView: each row associated with a different webserviceListView:每一行与不同的网络服务相关联
【发布时间】:2023-03-29 16:43:01
【问题描述】:

我在我的应用程序中使用了一个 listView,其中 listview 的每一行都从不同的 Web 服务获取其数据。目前,我正在以下列方式执行此操作:

    public View getView(final int position, View convertView, ViewGroup parent) {
         ViewHolder viewHolder;
          ...
          ... 
          DownloadData downloadData = new DownloadData(viewHolder); 
          downloadData.execute();
          return convertView;
     }

    class DownloadData extends AsyncTask<Void,Void,Void> //Downloads and update viewHolder
    {
     .....
    }

它运行完美。 但是,我觉得这不是一个好的设计,因为线程不应该在适配器内部完成。有更好的方法吗?

P.S:我的网络服务有一个限制,我无法更改它来解决这个问题

【问题讨论】:

    标签: android performance listview


    【解决方案1】:

    您绝对想在getView() 中这样做。 getView()实际上只是负责将一些对象变成视图,而不负责获取你的数据。

    我会确保在填充列表视图之前甚至期间拥有所需的所有数据。

    换句话说,在这个适配器之外,为什么不调用所有异步方法并让它们返回正确的对象以传递给适配器?

    您可以等到它们全部完成,或者并行调用它们并在每个完成时更新适配器,然后调用notifyDatasetChanged()

    【讨论】:

    • 我之前尝试过这样做。但是,我觉得即使是这种方法也有一个限制,即对notifyDataSetChanged() 的调用过多,从而影响性能。你有什么意见?
    • 我没有注意到经常调用notifyDataSetChanged() 有任何性能问题 - 最终如果您的视图发生变化...您的视图发生变化并且需要更新:)
    • 还有一个问题:调用 notifyDataSetChanged() 每次都会滚动 listView 到顶部。然后可能我不得不对此应用解决方法。使用getChildAt 或调用notifyDataSetChanged() 仅更新特定行会更好吗?
    • 嗯,根据我的经验,它不会一直滚动到顶部,只有在我设置新适配器时才会发生这种情况。顺便说一句,我也从不在适配器之外调用它。在适配器中,当你添加一个条目或者添加所有条目之后,调用notifyDatasetChanged()
    猜你喜欢
    • 2018-12-06
    • 1970-01-01
    • 2011-10-19
    • 2014-10-26
    • 1970-01-01
    • 2015-05-16
    • 1970-01-01
    • 2017-04-21
    • 1970-01-01
    相关资源
    最近更新 更多