2014-04-24 80 views
0

我正在使用此代碼從JSON獲取數據。使用SimpleAdapter來自URL的圖像

public class ShowContacts extends ListActivity{ 

    private static String url = "http://192.168.0.103/contacts.json"; 
    private static final String TAG_CONTACTS = "contacts"; 
    private static final String TAG_NAME = "name"; 
    private static final String TAG_IMAGE = "image"; 

    JSONArray contacts = null; 

    int index = 0; 

    ArrayList<HashMap<String, String>> contactList; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 

     super.onCreate(savedInstanceState);  
     setContentView(R.layout.showjson); 

     contactList = new ArrayList<HashMap<String, String>>(); 
     new GetContacts().execute(); 

    } 

    private class GetContacts extends AsyncTask<Void, Void, Void> { 

     @Override 
     protected Void doInBackground(Void... arg0) { 

      ServiceHandler sh = new ServiceHandler();   
      String jsonStr = sh.makeServiceCall(url, ServiceHandler.GET); 
      Log.d("Response: ", "> " + jsonStr); 

      if (jsonStr != null) { 
       try { 
        JSONObject jsonObj = new JSONObject(jsonStr); 

        contacts = jsonObj.getJSONArray(TAG_CONTACTS); 

        for (int i = 0; i < contacts.length(); i++) { 

         JSONObject c = contacts.getJSONObject(i); 

         String name = c.getString(TAG_NAME); 
         String image = c.getString(TAG_IMAGE); 

         HashMap<String, String> contact = new HashMap<String, String>(); 

         contact.put(TAG_NAME, name); 
         contact.put(TAG_IMAGE, image); 

         contactList.add(contact); 

        } 

       } catch (JSONException e){e.printStackTrace();} 
      } 
      return null; 
     } 

     @Override 
     protected void onPostExecute(Void result) { 

      super.onPostExecute(result); 

      String[] from = { TAG_NAME, TAG_IMAGE }; 

      int[] to = { R.id.name, R.id.image }; 

      ListAdapter adapter = new SimpleAdapter(

       ShowContacts.this, contactList, R.layout.list_item, from , to);   

      setListAdapter(adapter); 

     } 

    } 

} 

我想從JSON獲取名稱和圖像。我得到這個名字,它顯示在列表中,但我無法獲得圖像。這是我的JSON:

{ 
    "contacts": [ 
     { 
      "name": "John Smith", 
      "image": "http://192.168.0.103/image1.png" 
     }, 
     {     
      "name": "John Wayne", 
      "image": "http://192.168.0.103/image2.png" 
     }  
    ] 
} 

我認爲這是不工作,因爲圖像是在線和它試圖將其添加爲Drawable。我不知道如何做到這一點。有什麼辦法嗎?

+0

看看這個:http://cypressnorth.com/mobile-application-development/setting-android-google-volley-imageloader-networkimageview/或本http://blog.lemberg.co。英國/排雷部分3 - 圖像加載器,你必須加載圖像從該網址 –

+0

試試這個鏈接 - http://stackoverflow.com/questions/16789676/caching-images-and-displaying/16978285#16978285 –

回答

0

您應該使用LazyLoading下載圖像並將其加載到ImageView中。您不能直接加載圖片,只需簡單解析並設置網址到ImageView即可。

使用LazyLoadingUniversal ImageLoader

檢查的Loading Image from URL

+0

可以你請編輯一下我的代碼。我是Android新手。 – Enve

+0

@Enve您無法使用SimpleAdapter類下載和設置圖像。您必須爲此和您的適配器類實現'BaseAdapter',您可以使用LazyLoading加載圖像。查看我答案的最後一個鏈接。 – GrIsHu

0

1簡單的筆畫演示),您可以使用通用ImageLoader的從特定的URL下載圖像,並在DISPLY到您的列表的概念。

您不要使用直接IMAGEURL顯示它在列表項

請這種普遍的圖像加載器reference link

0

公共類ItemImagesAdapter延伸BaseAdapter {

private Context context; 
private ArrayList<String> contactList; 
private ImageLoader iml; 

public ItemImagesAdapter(Context ctx, ArrayList<String> image_paths) { 
    context = ctx; 
    contactList = image_paths; 
    ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(activity).build(); 
    ImageLoader.getInstance().init(config); 
    iml = ImageLoader.getInstance(); 
} 

@Override 
public int getCount() { 
    return contactList.size(); 
} 

@Override 
public Object getItem(int position) { 
    return contactList.get(position); 
} 

@Override 
public long getItemId(int position) { 
    return position; 
} 

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    LayoutInflater inflater = LayoutInflater.from(context); 
    if (convertView == null) { 
     convertView = inflater.inflate(R.layout.list_item_image, parent, false); 
    } 
    String imagepath = contactList.get(position).getImagePaths(); 
    ImageView image = (ImageView) convertView.findViewById(R.id.image1); 
      TextView tv = (TextView) convertView.findViewById(R.id.text1); 
      tv.setText(contactlist.get(position).getText); 
    iml.displayImage(imagepath, image); 
    return convertView; 
} 

}

內onPostExecute()

protected void onPostExecute(Void result) { 
     super.onPostExecute(result); 
     ItemImagesAdapter adapter = new ItemImagesAdapter(getAppicationContext(), contactlist); 
     listViewobj.setAdapter(adapter); 
    } 

從您的mainactivity中調用此函數。我希望你知道如何設置適配器.. 希望這可以幫助你

0

從服務器上下載圖像的一個和最好的方法是Android Query。你可以下載多達5K的圖像,而不會有任何內存錯誤。

下載來自Here的Android查詢jar,並將其放入項目的libs文件夾中。

AQuery aq = new AQuery(_scontext); // Android query object 
ImageView _imageObject= (ImageView) itemView.findViewById(R.id.product_image); // your imageview onbject 

//使用下面的代碼,您可以在imageview中設置圖像。

aq.id(_imageObject).image("image url as string");