2014-04-24 53 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");