正在解析 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 字符串并填充列表视图。这里的问题是我无法在列表视图中获取部门数据,而员工数据已正确填充。
这是模拟器的片段,显示了我在 运行 代码之后得到的列表视图。
任何人都可以纠正我哪里出错了。我怎样才能同时显示部门数据?
- 使用 Asyntask class 进行解析。
- 使用模型 class 和 setter getter。
- 所有数据在Asyntask的doInbackground方法中解析并添加到数组列表中(创建模型class的数组列表)。
- 在 PostExecute 方法中将数组列表数据传递给适配器。
- 将适配器设置为列表视图。
希望以上步骤对您有所帮助。
在您的 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 的成员(而不是相反,这是您当前拥有的)...即。一个部门可以有很多员工,但一个员工应该(通常)只有一个部门......至少我是这么想的......
总之,祝你好运~
我在解析 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 字符串并填充列表视图。这里的问题是我无法在列表视图中获取部门数据,而员工数据已正确填充。
这是模拟器的片段,显示了我在 运行 代码之后得到的列表视图。
任何人都可以纠正我哪里出错了。我怎样才能同时显示部门数据?
- 使用 Asyntask class 进行解析。
- 使用模型 class 和 setter getter。
- 所有数据在Asyntask的doInbackground方法中解析并添加到数组列表中(创建模型class的数组列表)。
- 在 PostExecute 方法中将数组列表数据传递给适配器。
- 将适配器设置为列表视图。
希望以上步骤对您有所帮助。
在您的 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 的成员(而不是相反,这是您当前拥有的)...即。一个部门可以有很多员工,但一个员工应该(通常)只有一个部门......至少我是这么想的......
总之,祝你好运~