You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 07:15:04