我的应用会收到一个jsonArray,其中包含类别及其图片网址的名称。 所以我想提取名称,并通过他们的网址下载图像。 实际上,我成功地提取了名称和网址,请看下面的代码:
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,然后在下载图像后,我只需修改它。 谢谢
答案 0 :(得分:1)
1:通常是的,虽然你最好制作适配器,然后在post执行后将值传递给它,然后调用adapter.NotifyDataSetChanged();
2:我建议不要重新发明轮子并使用“梦幻般的”毕加索图像加载库
http://square.github.io/picasso/
3:创建一个列表视图,将名称和URL传递给它,将数组适配器变为您自己的自定义,例如“myListAdapter”然后设置名称值,然后使用毕加索下载并将图像加载到您的imageview或其他任何你想用它做的事情。
http://www.vogella.com/tutorials/AndroidListView/article.html#adapterown_custom
E.g。
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();
}