我正在尝试将图片加载到列表视图中。图像的URL位于JSON数组中。我能够从JSON数组中获取所有内容,但不能获取图像。我是Android编程的新手。请帮帮我。我在json解析时遵循了android hive的教程来覆盖我的代码。
这是从json源获取所有数据的类:
package com.plusworks.appdev.youcancook.cuisineFrag;
import android.app.ProgressDialog;
import android.content.Context;
import android.content.Intent;
import android.os.AsyncTask;
import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.AdapterView;
import android.widget.FrameLayout;
import android.widget.ListAdapter;
import android.widget.ListView;
import android.widget.SimpleAdapter;
import android.widget.Toast;
import com.plusworks.appdev.youcancook.base.BaseActivity;
import com.plusworks.appdev.youcancook.base.CheckNetwork;
import com.plusworks.appdev.youcancook.R;
import com.plusworks.appdev.youcancook.base.ServiceHandler;
import com.plusworks.appdev.youcancook.base.SingleDishView;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import java.util.ArrayList;
import java.util.HashMap;
public class CuisineDishes extends BaseActivity {
private ProgressDialog pDialog;
// URL to get contacts JSON
private String url;
// JSON Node names
private static final String TAG_DISHES = "cuisinedishes";
private static final String TAG_ID = "id";
private static final String TAG_NAME = "name";
private static final String TAG_DESC="shortdesc";
private static final String TAG_VEG="veg";
private static final String TAG_DURATION="duration";
private static final String TAG_SERVINGS="servings";
private static final String TAG_LEVEL="level";
private static final String TAG_ICON="icon";
// contacts JSONArray
JSONArray dishes = null;
ArrayList<HashMap<String,String>> dishesList;
ListView lv;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
FrameLayout fl = (FrameLayout) findViewById(R.id.main_content);
LayoutInflater inflater = (LayoutInflater) this.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
final View contentView = inflater.inflate(R.layout.activity_cuisine_dishes, null, false);
fl.addView(contentView);
Intent mIntent = getIntent();
String cuisineName = mIntent.getStringExtra("CuisineName");
int cuisineId=mIntent.getIntExtra("CuisineId",1);
getSupportActionBar().setTitle(cuisineName + " Dishes");
switch (cuisineId){
case 1:
url="http://youcancook.site90.com/json/amdishes.json";
break;
case 2:
url="http://youcancook.site90.com/json/britdishes.json";
break;
case 3:
url="http://youcancook.site90.com/json/caribbdishes.json";
break;
case 4:
url="http://youcancook.site90.com/json/chindishes.json";
break;
case 5:
url="http://youcancook.site90.com/json/frenchdishes.json";
break;
case 6:
url="http://youcancook.site90.com/json/greekdishes.json";
break;
case 7:
url="http://youcancook.site90.com/json/inddishes.json";
break;
case 8:
url="http://youcancook.site90.com/json/italiandishes.json";
break;
case 9:
url="http://youcancook.site90.com/json/japanesedishes.json";
break;
case 10:
url="http://youcancook.site90.com/json/meditdishes.json";
break;
case 11:
url="http://youcancook.site90.com//json/mexicandishes.json";
break;
case 12:
url="http://youcancook.site90.com/json/moroccandishes.json";
break;
case 13:
url="http://youcancook.site90.com/json/spanishdishes.json";
break;
case 14:
url="http://youcancook.site90.com/json/thaidishes.json";
break;
case 15:
url="http://youcancook.site90.com/json/turkishdishes.json";
break;
case 16:
url="http://youcancook.site90.com/json/vietdishes.json";
break;
default:
break;
}
dishesList=new ArrayList<HashMap<String, String>>();
lv=(ListView)findViewById(R.id.dish_list);
//Code to check if internet is working
if(CheckNetwork.isInternetAvailable(CuisineDishes.this)) //returns true if internet available
{
new GetDishes().execute();
}
else
{
Toast.makeText(CuisineDishes.this,"Bummer! Couldn't connect to our server. Please check your " +
"internet connection",Toast.LENGTH_LONG).show();
}
lv.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
Intent intent = new Intent(contentView.getContext(), SingleDishView.class);
intent.putExtra("NAME",dishesList.get(position).get(TAG_NAME));
intent.putExtra("ID",dishesList.get(position).get(TAG_ID));
intent.putExtra("NAME",dishesList.get(position).get(TAG_NAME));
intent.putExtra("VEG",dishesList.get(position).get(TAG_VEG));
intent.putExtra("DURATION",dishesList.get(position).get(TAG_DURATION));
intent.putExtra("SERVINGS",dishesList.get(position).get(TAG_SERVINGS));
intent.putExtra("LEVEL",dishesList.get(position).get(TAG_LEVEL));
startActivity(intent);
}
});
}
@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_cuisine_dishes, 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, sop long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
return super.onOptionsItemSelected(item);
}
private class GetDishes extends AsyncTask<Void, Void, Void>{
@Override
protected void onPreExecute() {
super.onPreExecute();
// Showing progress dialog
pDialog = new ProgressDialog(CuisineDishes.this);
pDialog.setMessage("Fetching dishes...");
pDialog.setCancelable(false);
pDialog.show();
}
@Override
protected Void doInBackground(Void... arg0) {
// Creating service handler class instance
ServiceHandler sh = new ServiceHandler();
// Making a request to url and getting response
String jsonStr = sh.makeServiceCall(url, ServiceHandler.GET);
if (jsonStr != null) {
try {
JSONObject jsonObj = new JSONObject(jsonStr);
// Getting JSON Array node
dishes = jsonObj.getJSONArray(TAG_DISHES);
// looping through All Contacts
for (int i = 0; i < dishes.length(); i++) {
JSONObject c = dishes.getJSONObject(i);
String id = c.getString(TAG_ID);
String name = c.getString(TAG_NAME);
String shortdesc = c.getString(TAG_DESC);
String veg = c.getString(TAG_VEG);
String duration = c.getString(TAG_DURATION);
String servings = c.getString(TAG_SERVINGS);
String level = c.getString(TAG_LEVEL);
String icon=c.getString(TAG_ICON);
// tmp hashmap for single contact
HashMap<String, String> dishes_temp = new HashMap<String, String>();
// adding each child node to HashMap key => value
dishes_temp.put(TAG_ID, id);
dishes_temp.put(TAG_NAME, name);
dishes_temp.put(TAG_DESC, shortdesc);
dishes_temp.put(TAG_VEG, veg);
dishes_temp.put(TAG_DURATION, duration);
dishes_temp.put(TAG_SERVINGS, servings);
dishes_temp.put(TAG_LEVEL, level);
dishes_temp.put(TAG_ICON, icon);
// adding contact to contact list
dishesList.add(dishes_temp);
}
} catch (JSONException e) {
e.printStackTrace();
}
}
return null;
}
@Override
protected void onPostExecute(Void result) {
super.onPostExecute(result);
// Dismiss the progress dialog
if (pDialog.isShowing())
pDialog.dismiss();
/**
* Updating parsed JSON data into ListView
* */
ListAdapter adapter = new SimpleAdapter(
CuisineDishes.this, dishesList,
R.layout.cuisine_dish_list_item, new String[] { TAG_NAME, TAG_DESC, TAG_ICON}, new int[] { R.id.nameDish,
R.id.descDish, R.id.dish_icon});
lv.setAdapter(adapter);
}
}
}
以下是单个项目的布局文件:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<ImageView
android:id="@+id/dish_icon"
android:layout_width="40dp"
android:layout_height="40dp"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"
android:layout_marginLeft="10dp"
android:layout_marginRight="20dp"
android:layout_marginTop="5dp" />
<TextView
android:id="@+id/nameDish"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
android:layout_toEndOf="@+id/dish_icon"
android:layout_toRightOf="@+id/dish_icon"
android:gravity="center_vertical"
android:text="Line 1"
android:textColor="#000"
android:textSize="20sp" />
<TextView
android:id="@+id/descDish"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentEnd="true"
android:layout_alignParentRight="true"
android:layout_below="@+id/nameDish"
android:layout_toRightOf="@+id/dish_icon"
android:text="Line 2"
android:textSize="17sp"/>
</RelativeLayout>
答案 0 :(得分:0)
protected Bitmap doInBackground(String... args) {
try {
bitmap = BitmapFactory.decodeStream((InputStream)new URL(args[0]).getContent());
} catch (Exception e) {
e.printStackTrace();
}
return bitmap;
}
protected void onPostExecute(Bitmap image) {
if(image != null){
img.setImageBitmap(image);
pDialog.dismiss();
}
点击此处&gt; Setting image from url to ImageView with AsynchTask
答案 1 :(得分:0)
private String getSplitImages(JSONArray array) {
StringBuilder result = new StringBuilder();
try {
for (int i = 0; i < array.length(); i++) {
result.append(array.get(i).toString());
result.append(",");
}
} catch (JSONException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return result.length() > 0 ? result.substring(0, result.length() - 1)
: "";
}