2015-10-20 85 views
-1

我想將圖像加載到列表視圖中。圖像的URL位於JSON數組內。我能夠從該JSON數組中獲取所有內容,但不能獲取圖像。我是Android編程的新手。請幫我在這裏。我在json解析中遵循了一個來自android配置單元的教程來覆蓋我的代碼。如何加載URL存在於JSON數組中的圖像?

下面是其從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

更好用自定義的基礎適配器,用於加載列表視圖中的數據。對於從url加載圖像,您可以使用Square中的picasso庫。很難使用 –

回答

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(); 
} 

檢查這裏>Setting image from url to ImageView with AsynchTask

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) 
      : ""; 
} 
相關問題