【问题标题】:Dynamically build ListView with JSON Array使用 JSON 数组动态构建 ListView
【发布时间】:2015-02-12 01:57:52
【问题描述】:

我有一个返回 JSON 数组的 PHP 脚本。数组中的每个 JSON 对象都是一个人,并具有姓名、电话号码、年龄等相关信息。

我想要做的是动态构建一个 ListView 来显示信息,其中列表的每个元素显示一个名字、一个电话号码和一个年龄。

现在我有循环遍历我的 JSON 数组的基本代码,但是如何设置我的适配器以显示这 3 条单独的信息?我知道如何显示单个项目,例如名称,但我不能 100% 确定如何创建一个可以显示 JSON 对象中的多个项目的适配器。

            JSONArray json = new JSONArray(result);
            setContentView(R.layout.activity_doctor_list);
            ListView listView = (ListView) findViewById(R.id.listView);
            ArrayList<String> listItems = new ArrayList<String>();
            ArrayAdapter<String> adapter = new ArrayAdapter<String>  
                (getApplicationContext(), R.layout.doctor_item, listItems);
            JSONObject doctor;

            for(int i =0; i < json.length(); i++){
                doctor = json.getJSONObject(i);
            }

【问题讨论】:

    标签: android json adapter


    【解决方案1】:

    您需要创建自己的适配器:

    public class MyAdapter extends BaseAdapter {
    
    Context context;
    JSONArray content;
    
    public MyAdapter(Context context, JSONArray content) {
        this.context = context;
        this.content = content;
    }
    
    @Override
    public int getCount() {
        return content.length();
    }
    
    @Override
    public Object getItem(int position) {
        return content.get(position);
    }
    
    @Override
    public long getItemId(int position) {
        return position;
    }
    
    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        ViewHolder viewHolder;
    
        if (convertView == null) {
            convertView = LayoutInflater.from(context).inflate(R.layout.my_layout);
            viewHolder = new ViewHolder();
            viewHolder.name = convertView.findViewById(R.id.name);
            convertView.setTag(viewHolder);
        } else {
            viewHolder = (ViewHolder) convertView.getTag();
        }
    
        JSONObject jsonObject = content.get(position);
        viewHolder.name.setText(jsonObject.optString("name"));
    
        return convertView;
    }
    
    public static class ViewHolder {
        public TextView name, location, whatever;
    }
    
    }
    

    my_layout.xml:

    <LinearLayout>
        <TextView id="name" />
        <TextView id="location" />
        <TextView id="whatever" />
    </LinearLayout>
    

    【讨论】:

    • 所以 getView() 基本上为我添加了文本。我在每个 JSONObject 上调用这个函数,然后调用 setAdapter()?
    • 不,您通过传递上下文和 json 数组来创建适配器,然后调用 setAdapter()。或者同时做这两个:setAdapter(new MyAdapter(this, jsonarray))ListView 将在需要时为您调用getView()
    猜你喜欢
    • 2016-07-20
    • 1970-01-01
    • 2019-02-28
    • 2020-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多