2015-02-12 81 views
1

我有一个返回JSON数组的PHP脚本。数组中的每个JSON对象都是一个人,并且具有诸如姓名,电话号码,年龄等相关信息。动态构建带有JSON数组的ListView

我想要做的是动态构建一个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); 
      } 

回答

0

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

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> 
+0

所以getView()主要增加了对我的文字。我在每个JSONObject上调用这个函数,然后调用setAdapter()? – ryhmaxd 2015-02-12 02:33:47

+0

不,您通过传递上下文和json数组来创建适配器,然后调用'setAdapter()'。或者立即执行:'setAdapter(new MyAdapter(this,jsonarray))'。 'ListView'会随时调用'getView()'。 – mbmc 2015-02-12 03:01:29