【发布时间】:2014-07-14 21:41:55
【问题描述】:
我正在尝试通过为现有 ListView 提供 Expandable ListView 来扩展我的应用程序。我发现的教程/答案通常没有很好的文档记录,也没有检查数据是动态的情况(在我的情况下是来自 API 的解析 JSON 数组响应)。
我有两个数据类:SearchItem 和 InventoryItem。我用 Volley 调用 API,JSON 看起来像这样:
[
{"product":"foobar", "image_url":"someurl", "inventory_items":
[
{"some_attribute":"some_value"},
{"some_attribute":"some_value"},
{"some_attribute":"some_value"}
]
},
{"product.......
}
]
到目前为止,我只解析了 SearchItems 的 JSON,如下所示:
private void parseJsonFeed(JSONArray response) {
try {
for (int i = 0; i < response.length(); i++) {
JSONObject searchObj = (JSONObject) response.get(i);
SearchItem searchItem = new SearchItem();
searchItem.setId(searchObj.getInt("id"));
searchItem.setProduct(searchObj.getString("product"));
searchItem.setItemImg(searchObj.getString("img"));
searchItem.setId(searchObj.getInt("id"));
searchItem.setUpc(searchObj.getInt("upc"));
searchItems.add(searchItem);
}
// notify data changes to list adapater
listAdapter.notifyDataSetChanged();
} catch (JSONException e) {
e.printStackTrace();
}
}
现在如何将子 InvetoryItems 添加到适配器中的每个 SearchItem?在解析响应时,我可以遍历每个InventoryItem,但是如何将其添加为相应SearchItem 的子元素?下面是我现有的 BaseAdapter 扩展:
public class SearchItemAdapter extends BaseAdapter {
private Activity activity;
private LayoutInflater inflater;
private List<SearchItem> searchItems;
ImageLoader imageLoader = AppController.getInstance().getImageLoader();
public SearchItemAdapter(Activity activity, List<SearchItem> searchItems) {
this.activity = activity;
this.searchItems = searchItems;
}
@Override
public int getCount() {
return searchItems.size();
}
@Override
public Object getItem(int location) {
return searchItems.get(location);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
if (inflater == null)
inflater = (LayoutInflater) activity
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
if (convertView == null)
convertView = inflater.inflate(R.layout.search_item, null);
if (imageLoader == null)
imageLoader = AppController.getInstance().getImageLoader();
TextView product = (TextView) convertView.findViewById(R.id.product);
TextView upc = (TextView) convertView.findViewById(R.id.upc);
NetworkImageView itemImg = (NetworkImageView) convertView
.findViewById(R.id.itemImg);
SearchItem searchItem = searchItems.get(position);
// product info
product.setText(searchItem.getProduct());
// item pic
itemImg.setImageUrl(searchItem.getItemImg(), imageLoader);
upc.setText(String.valueOf(searchItem.getUpc()));
return convertView;
}
}
【问题讨论】:
-
谢谢,我喜欢他的教程。不幸的是,本教程实际上只涵盖了一组静态列表项。对我来说,令人困惑的部分不是解析 JSON,而是更多如何解析对象并将对象作为子元素添加到 ListView。有时我希望他能多评论他的代码,以便像我这样的新手能更好地理解它。
标签: android json listview android-listview