正在解析 JSON 数据并填充 ListView

Parsing JSON data and populating ListView

我在解析 json 数据和填充列表视图时遇到问题。

下面的示例是我尝试解析的 json 数据以及显示我正在尝试实现的示例代码的其余部分。

[
    {
        "id": 123,
        "name": "abcd",
        "department": {
            "name": "xyz",
            "code": 4536
        }
    },
    {
        "id": 123,
        "name": "abcd",
        "department": {
            "name": "xyz",
            "code": 4536
        }
    }
]

这是我的主Activityclass

public class MainActivity extends Activity {
    private ListView employeeListView;
    private Employee employees[];
    private ArrayAdapter<Employee> employeeArrayAdapter;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        employeeListView=(ListView)findViewById(R.id.employeeListView);
    }

    public void updateListView(){
        String a="[{\"id\":123,\"name\":\"abcd\",\"department\":{\"name\":\"xyz\",\"code\":4536}},{\"id\":123,\"name\":\"abcd\",\"department\":{\"name\":\"xyz\",\"code\":4536}}]";
        try{
            JSONArray jsonArray=new JSONArray(a);
            JSONObject jsonObject;
            employees=new Employee[jsonArray.length()];
            Employee employee;
            Employee.Department department;
            int x=0;
            while(x<jsonArray.length()){
                jsonObject=jsonArray.getJSONObject(x);
                employee=new Employee();
                department=employee.new Department();
                employee.setCode(jsonObject.optInt("id"));
                employee.setName(jsonObject.optString("name"));
                JSONObject jsonDepartment=jsonObject.getJSONObject("department");
                department.setDepartmentName(jsonDepartment.optString("name"));
                department.setDepartmentCode(jsonDepartment.optInt("code"));
                employee.setDepartment(department);
                employees[x]=employee;
                x++;
            }
            employeeArrayAdapter=new ArrayAdapter<Employee>(getApplicationContext(),android.R.layout.simple_list_item_1,employees);
            employeeListView.setAdapter(employeeArrayAdapter);
        }catch (Throwable t){
            Toast.makeText(getApplicationContext(),t.toString(),Toast.LENGTH_LONG).show();
        }

    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.menu_main, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();

        //noinspection SimplifiableIfStatement
        if (id == R.id.action_settings) {
            return true;
        }

        return super.onOptionsItemSelected(item);
    }

    public void onButtonClick(View view) {
        updateListView();
    }   
}

这是我的 pojo class

public class Employee {
    private int code;
    private String name;
    private Department department;
   //getter setter for code, name and Department
    public String toString(){
        return this.name+" "+this.code;
    }


    public class Department{//inner class
        int departmentCode;
        String departmentName;
       //getter setter for departmentCode and departmentName
    }
}

OnButtonClick 函数我正在调用 updateListView,它解析 json 字符串并填充列表视图。这里的问题是我无法在列表视图中获取部门数据,而员工数据已正确填充。

这是模拟器的片段,显示了我在 运行 代码之后得到的列表视图。

任何人都可以纠正我哪里出错了。我怎样才能同时显示部门数据?

  1. 使用 Asyntask class 进行解析。
  2. 使用模型 class 和 setter getter。
  3. 所有数据在Asyntask的doInbackground方法中解析并添加到数组列表中(创建模型class的数组列表)。
  4. 在 PostExecute 方法中将数组列表数据传递给适配器。
  5. 将适配器设置为列表视图。

希望以上步骤对您有所帮助。

在您的 class 中,您正在为 while 循环使用相同的对象。

employee=new Employee();
            department=employee.new Department();

但应该是

Employee employee=new Employee();
          Department  department=employee.new Department();

在你的 while 循环中。

好吧,因为您使用的是默认的 ArrayAdapter,所以您实际上并没有太多控制权...如果您想要很好地格式化所有内容并真正控制从您的自定义对象(您可能会),您需要为您的 Employee 对象创建一个自定义 ArrayAdapter 并从那里覆盖 getView() 方法。

但是,如果您现在只想解决这个问题...您可以只编辑员工的覆盖 toString() 方法以包含部门数据,如下所示:

@Override
public String toString(){
    String toDisplay = this.name + " " + this.code;
    if(department != null) toDisplay += "\n" + department.toString();
    return toDisplay;
}

然后在您的 Department 对象中覆盖 toString:

@Override
public String toString(){
    return departmentName;
}

此外,从面向对象的角度来看,Employee 似乎应该是 Department 的成员(而不是相反,这是您当前拥有的)...即。一个部门可以有很多员工,但一个员工应该(通常)只有一个部门......至少我是这么想的......

总之,祝你好运~