所以我測試了一個在listview上實現的android應用程序。該列表使用從JSON服務器獲取的數據。視圖中使用的三個字段是圖像,名稱,說明。我測試了所有的輸入,數據來自服務器,在適配器中設置(使用LOG標記檢查),但該應用程序沒有顯示任何視圖,有時會崩潰。總之,我無法看到任何listView。請幫助... :)解析來自JSON服務器的數據時Android ListView不顯示
這些是我的項目使用的文件...
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();
}
}
}
}
演員適配器
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;
}
}
學習如何從服務器獲取數據並通過listview [here](http://androhub.com/android-json-parser/)設置。 –
是您的網址工作? – Androider
是的..該URL正在工作...! –