【发布时间】:2015-11-24 02:08:07
【问题描述】:
所以我正在测试一个在 listview 上实现的 android 应用程序。该列表使用从 JSON 服务器获取的数据。视图中使用的三个字段是图像、名称、描述。我已经测试了所有输入,数据正确来自服务器,在适配器中设置(使用 LOG 标签检查),但应用程序没有显示任何视图,有时甚至崩溃。总之,我看不到任何列表视图。请帮忙... :)
这些是我的项目使用的文件...
MainActivity.java
package com.example.aditya.jtest;
import android.app.Activity;
import android.app.ProgressDialog;
import android.os.AsyncTask;
import android.os.Bundle;
import android.util.Log;
import android.widget.ListView;
import android.widget.Toast;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.util.EntityUtils;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import java.io.IOException;
import java.util.ArrayList;
public class MainActivity extends Activity {
ListView list;
ActorsAdapter adapter;
ArrayList<Actors> actorsList;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
list = (ListView) findViewById(R.id.list);
actorsList = new ArrayList<Actors>();
new ActorsAsynTask().execute("http://microblogging.wingnity.com/JSONParsingTutorial/ `jsonActors");
list.setAdapter(adapter);
}
public class ActorsAsynTask extends AsyncTask<String, Void, Boolean> {
ProgressDialog dialog;
@Override
protected void onPreExecute() {
super.onPreExecute();
dialog = new ProgressDialog(MainActivity.this);
dialog.setMessage("Loading, please wait");
dialog.setTitle("Connecting server");
dialog.show();
dialog.setCancelable(false);
}
@Override
protected Boolean doInBackground(String... params) {
try {
HttpClient client = new DefaultHttpClient();
HttpPost post = new HttpPost(params[0]);
HttpResponse response = client.execute(post);
int status = response.getStatusLine().getStatusCode();
//Log.d("MyFilter2", "" + status + " Value Recieved: " + params[0]);
if (status == 200) {
HttpEntity entity = response.getEntity();
String data = EntityUtils.toString(entity);
//Log.d("MyFilter", data);
JSONObject jObj = new JSONObject(data);
JSONArray jArray = jObj.getJSONArray("actors");
//Log.d("MyFilterjObj: ", jObj.toString());
//Log.d("MyFilterjArray: ", jArray.toString() + "\n" + jArray.length());
for(int i = 0; i <= jArray.length(); i++) {
Actors actors = new Actors();
JSONObject jRealObject = jArray.getJSONObject(i);
//Log.d("\nMyFilter JRealObject[" + i + "]: ", jRealObject.toString());
actors.setName(jRealObject.getString("name"));
actors.setDescription(jRealObject.getString("description"));
actors.setImage(jRealObject.getString("image"));
Log.d("\nMyFilter ["+ i +"]", jRealObject.getString("name"));
Log.d("MyFilter ["+ i +"]", jRealObject.getString("description"));
Log.d("MyFilter ["+ i +"]", jRealObject.getString("image"));
actorsList.add(actors);
}
return true;
}
} catch (IOException e) {
e.printStackTrace();
} catch (JSONException e) {
e.printStackTrace();
}
return false;
}
@Override
protected void onPostExecute(Boolean aBoolean) {
super.onPostExecute(aBoolean);
dialog.cancel();
adapter.notifyDataSetChanged();
if(aBoolean == false){
//Show a message that data was not parsed
Toast.makeText(getApplicationContext(), "Unable to fetch data from server", Toast.LENGTH_LONG).show();
}
}
}
}
Actor 适配器
package com.example.aditya.jtest;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.AsyncTask;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.ImageView;
import android.widget.TextView;
import java.io.IOException;
import java.io.InputStream;
import java.net.MalformedURLException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
public class ActorsAdapter extends ArrayAdapter<Actors> {
ArrayList<Actors> ArrayListActors;
int Resource;
Context context;
LayoutInflater vi;
ViewHolder holder;
public ActorsAdapter(Context context, int resource, ArrayList<Actors> objects) {
super(context, R.layout.row, objects);
ArrayListActors = objects;
Resource = resource;
this.context = context;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
vi = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View v = convertView;
if(v == null){
v = vi.inflate(Resource, null);
holder = new ViewHolder();
holder.image = (ImageView) convertView.findViewById(R.id.image);
holder.name = (TextView) convertView.findViewById(R.id.name);
holder.description = (TextView) convertView.findViewById(R.id.description);
convertView.setTag(holder);
} else{
holder = (ViewHolder) convertView.getTag();
}
new DownloadImageTask(holder.image).execute(ArrayListActors.get(position).getImage());
holder.name.setText(ArrayListActors.get(position).getName());
holder.description .setText(ArrayListActors.get(position).getDescription());
return v;
}
static class ViewHolder{
public ImageView image;
public TextView name;
public TextView description;
}
private class DownloadImageTask extends AsyncTask<String, Void, Bitmap>{
ImageView bmImage;
public DownloadImageTask(ImageView bmImage) {
this.bmImage = bmImage;
}
@Override
protected Bitmap doInBackground(String... params) {
String urlDisplay = params[0];
Bitmap mIcon1 = null;
try{
InputStream in = new java.net.URL(urlDisplay).openStream();
mIcon1 = BitmapFactory.decodeStream(in);
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return mIcon1;
}
@Override
protected void onPostExecute(Bitmap bitmap) {
bmImage.setImageBitmap(bitmap);
}
}
}
Actors.java
package com.example.aditya.jtest;
public class Actors {
private String image;
private String name;
private String description;
public Actors() {
}
public Actors(String name, String description, String image) {
super();
this.name = name;
this.description = description;
this.image = image;
}
public String getImage() {
return image;
}
public void setImage(String image) {
this.image = image;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
}
【问题讨论】:
-
了解如何从服务器获取数据并设置列表视图here。
-
你的网址有效吗?
-
是的.. URL 正在工作...!!
标签: android json listview android-listview