Android中如何用JSONArray替代ArrayList在ListView展示数据?
把ListView数据源从ArrayList切换到JSONArray的实现方案
嘿,我完全懂你的需求——换成JSONArray当数据源后,后续对接服务器返回的JSON数据会顺畅太多,不用再把零散数据拆进多个ArrayList了。咱们一步步来改造,很简单:
第一步:重构数据初始化,生成JSONArray
原来的方式是用多个ArrayList分别存不同字段,现在咱们把每一条数据的所有属性封装成一个JSONObject,再把所有JSONObject塞进JSONArray里,结构和服务器返回的JSON完全对齐。
修改你的setData方法如下:
private JSONArray coinsJsonArray; // 先声明全局变量 private void setData() { coinsJsonArray = new JSONArray(); try { // 封装第一条数据 JSONObject btcObj = new JSONObject(); btcObj.put("coinName", "BTC"); btcObj.put("price", "$" + mytext1); btcObj.put("priceChange", mytext4 + "%"); btcObj.put("flagRes", R.drawable.bit); btcObj.put("bellRes", R.drawable.ring); coinsJsonArray.put(btcObj); // 封装第二条数据 JSONObject ethObj = new JSONObject(); ethObj.put("coinName", "ETH"); ethObj.put("price", "$" + mytext2); ethObj.put("priceChange", mytext5 + "%"); ethObj.put("flagRes", R.drawable.eth); ethObj.put("bellRes", R.drawable.ring); coinsJsonArray.put(ethObj); // 封装第三条数据 JSONObject ltcObj = new JSONObject(); ltcObj.put("coinName", "LTC"); ltcObj.put("price", "$" + mytext3); ltcObj.put("priceChange", mytext6 + "%"); ltcObj.put("flagRes", R.drawable.ltc); ltcObj.put("bellRes", R.drawable.ring); coinsJsonArray.put(ltcObj); } catch (JSONException e) { e.printStackTrace(); } }
第二步:修改自定义适配器,适配JSONArray
原来的Adapter_list继承了ArrayAdapter<String>,现在换成继承BaseAdapter,直接以JSONArray作为核心数据源,灵活性更高。
修改后的适配器代码:
public class CoinAdapter extends BaseAdapter { private Context mContext; private JSONArray mJsonArray; public CoinAdapter(Context context, JSONArray jsonArray) { this.mContext = context; this.mJsonArray = jsonArray; } @Override public int getCount() { return mJsonArray.length(); } @Override public JSONObject getItem(int position) { try { return mJsonArray.getJSONObject(position); } catch (JSONException e) { e.printStackTrace(); return null; } } @Override public long getItemId(int position) { return position; } @Override public View getView(int position, View convertView, ViewGroup parent) { ViewHolder holder; LayoutInflater inflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE); if (convertView == null) { convertView = inflater.inflate(R.layout.list, parent, false); holder = new ViewHolder(convertView); convertView.setTag(holder); } else { holder = (ViewHolder) convertView.getTag(); } // 取出当前位置的JSON数据 JSONObject currentItem = getItem(position); if (currentItem != null) { try { // 为控件赋值 holder.coin.setText(currentItem.getString("coinName")); holder.price.setText(currentItem.getString("price")); holder.price2.setText(currentItem.getString("priceChange")); holder.imageView.setImageResource(currentItem.getInt("flagRes")); holder.imageView2.setImageResource(currentItem.getInt("bellRes")); } catch (JSONException e) { e.printStackTrace(); } } return convertView; } private class ViewHolder { private ImageView imageView, imageView2; private TextView coin, price, price2; public ViewHolder(View v) { imageView = v.findViewById(R.id.imageView); imageView2 = v.findViewById(R.id.imageView2); coin = v.findViewById(R.id.textView8); price = v.findViewById(R.id.textView9); price2 = v.findViewById(R.id.textView10); } } }
我把适配器名字改成了CoinAdapter,更语义化,你也可以保留原来的名字,看个人习惯。
第三步:在Activity中初始化适配器并绑定ListView
原来的多个ArrayList初始化代码可以删掉了,直接用JSONArray搞定:
// 初始化数据 setData(); // 创建适配器 CoinAdapter adapter = new CoinAdapter(this, coinsJsonArray); // 绑定到ListView yourListView.setAdapter(adapter);
后续对接服务器的便捷性
等你从服务器拿到JSON字符串后,直接转成JSONArray就能用,完全不用手动拆分数据:
// 假设serverResponse是服务器返回的JSON字符串 JSONArray serverJsonArray = new JSONArray(serverResponse); // 直接传入适配器 CoinAdapter adapter = new CoinAdapter(this, serverJsonArray); yourListView.setAdapter(adapter);
省去了拆数据的麻烦,完美适配服务器返回格式!
内容的提问来源于stack exchange,提问作者gourav manuja
相关产品推荐
相关产品推荐

