我的应用程序收到一个 jsonArray,其中包含类别名称及其图像网址。 所以我想提取名称并通过它们的网址下载图像。 实际上我成功地提取了名称和 url,请看下面的代码:
private class ReadPlacesFeedTask extends AsyncTask<String, Void, String> {
protected String doInBackground(String... urls) {
return readJSONFeed(urls[0]);
}
protected void onPostExecute(String result) {
try {
JSONObject jsonobject = new JSONObject(result);
JSONArray categories = new JSONArray(
jsonobject.getString("categories"));
for (int i = 0; i < categories.length(); i++) {
JSONObject category = categories.getJSONObject(i);
names.add(category.getString("name"));
images.add(category.getString("image"));
}
} catch (JSONException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
ArrayAdapter<String> adapter = new ArrayAdapter<String>(
getBaseContext(), R.layout.row_channel_layout,
R.id.channel_name, names);
channel_list = (ListView) findViewById(R.id.channel_list);
channel_list.setAdapter(adapter);
}
}
我的问题: 1. 在 onPostExecute 方法中构建适配器是否可以? 2.我应该写另一个 synctasck 类来下载图像吗?或者在 doInbackground 方法中提取 url,然后下载图像,并将图像和名称都返回给 onPostExecute 方法。 实际上我试过这个,我认为它很慢,因为在后台方法中解码 json 非常慢! 3.我怎么能在下载名称后构建listView,然后在下载图像后,我只是修改它。 谢谢你
最佳答案
1:通常是的,尽管您最好制作适配器,然后在执行后将值传递给它,然后调用 adapter.NotifyDataSetChanged();
2:我建议不要重新发明轮子,使用“神奇”的毕加索图像加载库
http://square.github.io/picasso/
3: 创建一个 ListView ,将名称和 url 传递给它,将数组适配器制作成您自己的自定义 e.g. “myListAdapter”,然后设置名称值,然后使用 picasso 下载图像并将其加载到您的 imageview 或任何您想用它做的其他事情。
http://www.vogella.com/tutorials/AndroidListView/article.html#adapterown_custom
例如
public class MainActivity extends Activity
{
ArrayList<String> myListItems = new ArrayList<String>();
ArrayAdapter<String> adapter;
@Override
protected void onCreate(Bundle savedInstanceState)
{
adapter = new ArrayAdapter(this,R.layout.row_category_layout,R.id.category_name, names);
//execute my data task
}
public void dataTask()
{
//GOT SOME DATA
myListItems.add("MYDATA");
adapter.notifyDataSetChanged();
}
关于android - 从json、android下载图片,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22314640/