我在我的应用程序中使用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
{
.....
}
它运行完美。
但是,我认为这不是一个好的设计,因为线程不应在适配器内部完成。有更好的方法吗?
附注:我的网络服务受到限制,我无法更改它来解决此问题
最佳答案
您绝对不想在getView()
中执行此操作。 getView()
实际上仅负责将某些对象转换为视图,而不负责获取数据。
我将确保在列表视图填充之前或什至期间,我拥有所需的所有数据。
换句话说,在此适配器之外,为什么不调用所有异步方法并使它们返回正确的对象以传递到适配器中呢?
您可以等待它们完成,或者并行调用它们,并在每个适配器完成时更新适配器,然后调用notifyDatasetChanged()
。