如何从 api 中的参数获取图像 URL 并将其显示到 Imageview
How to get image URL from parameters in api and display it into Imageview
我正在开发一个社交网络应用程序,我必须在其中从服务器获取用户的详细信息。我在参数中获取用户的个人资料图像 url,但我在获取图像和显示它时遇到问题,因为每次它在 Imageview 中只显示图像 url。
这是我的 api 供稿:-
{"post_id":"559",
"userid":"11",
"content":"\u0908\u092e\u093e\u0928\u0926\u093e\u0930\u0940 \u090f\u0915 \u092c\u094b\u0939\u094b\u0924 \u092e\u0939\u0902\u0917\u0940 \u091a\u0940\u095b \u0939\u0948.... \u0917\u093f\u0930\u0947 \u0939\u0941\u090f \u0932\u094b\u0917\u094b \u0938\u0947 \u0909\u0938\u0915\u0940 \u0909\u092e\u094d\u092e\u0940\u0926 \u0928\u0939\u0940\u0902 \u0915\u0930\u0928\u0940 \u091a\u093e\u0939\u093f\u090f..",
"favorite_count":"1",
"reply_count":"2",
"repost_count":"0",
"post_location":"",
"created_date":"2015-05-29 12:04:28",
"name":"devraj singh","user_image":"http:\/\/sabakuch.com\/public\/images_upload\/avatars\/ozone\/11_30_11149322_10205781000956557_74437511307260696_n.jpg",
"post_images":null,
"gender":"1"}
这是我的适配器 class,我从中获取详细信息。
public class OzoneAdapter extends BaseAdapter{
ArrayList<Ozone_Beans> feedList;
LayoutInflater inflater;
Activity activity;
Context context;
ImageLoader imageloader;
public OzoneAdapter(ArrayList<Ozone_Beans> feedList, Activity activity) {
// TODO Auto-generated constructor stub
super();
this.feedList = feedList;
this.activity = activity;
inflater = (LayoutInflater )activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
imageloader = ImageLoader.getInstance();
imageloader.init(ImageLoaderConfiguration.createDefault(activity));
}
@Override
public int getCount() {
// TODO Auto-generated method stub
return feedList.size();
}
@Override
public Object getItem(int position) {
// TODO Auto-generated method stub
return feedList.get(position);
}
@Override
public long getItemId(int position) {
// TODO Auto-generated method stub
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
// TODO Auto-generated method stub
View vi = convertView;
ViewHolder holder;
if(convertView==null)
//convertView = inflater.inflate(R.layout.ozone_item, null);
convertView = inflater.inflate(R.layout.ozone_item, null);
holder = new ViewHolder();
holder.tvDate = (TextView)convertView.findViewById(R.id.ozone_name);
holder.tvContent = (TextView)convertView.findViewById(R.id.ozone_content);
holder.tvUser = (TextView)convertView.findViewById(R.id.ozone_date);
holder.image_user_image = (ImageView)convertView.findViewById(R.id.ozone_user_image);
holder.postImage = (ImageView)convertView.findViewById(R.id.ozone_post_image);
holder.tvUser.setText(feedList.get(position).getName());
holder.tvDate.setText(feedList.get(position).getCreated_date());
holder.tvContent.setText(feedList.get(position).getContent());
//imageloader.displayImage(feedList.get(position).getUser_image(), holder.image_user_image);
//imageloader.displayImage(feedList.get(position).getUser_image(), holder.image_user_image);
//holder.image_user_image.setImageURI(feedList.get(position).getUser_image());
// imageloader.displayImage(feedList.get(position).getTweet_images(), holder.postImage);
return convertView;
}
public class ViewHolder {
public ImageView image_user_image;
public ImageView postImage;
TextView tvContent , tvUser, tvDate;
}
}
看看这个尝试在你的代码中实现
class Holder {
TextView tv1, tv2, tv3;
ImageView iv1, iv2;
public Holder(View v) {
tv1 = (TextView) v.findViewById(R.id.textView);
tv2 = (TextView) v.findViewById(R.id.textView2);
tv3 = (TextView)v.findViewById(R.id.tvCouponDeal);
iv1 = (ImageView)v.findViewById(R.id.imageView3);
iv2 = (ImageView)v.findViewById(R.id.imageView4);
}
}
class MyAdapter extends ArrayAdapter<String> {
Context context;
private ImageLoadingListener animateFirstListener;
public MyAdapter(Context context, int resource) {
super(context, resource);
this.context = context;
}
@Override
public int getCount() {
return categoryList.size();
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View dataRow = convertView;
Holder holder = null;
if (dataRow == null) {
LayoutInflater inflater = (LayoutInflater) getActivity().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
dataRow = inflater.inflate(R.layout.category_items_cell, parent, false);
holder = new Holder(dataRow);
dataRow.setTag(holder);
} else {
holder = (Holder) dataRow.getTag();
}
holder.tv1.setText(categoryList.get(position).getMerchantName());
holder.tv2.setText(categoryList.get(position).getVoucherOfferlogo());
holder.tv3.setText(categoryList.get(position).getOffertype());
if(categoryList.get(position).getIsexclusive().equals("1"))
holder.iv2.setImageResource(R.drawable.fav_selected);
ImageLoader.getInstance().displayImage(categoryList.get(position).getMerchantStanderedimage(), holder.iv1, options, animateFirstListener);
return dataRow;
}
}
private static class AnimateFirstDisplayListener extends SimpleImageLoadingListener {
static final List<String> displayedImages = Collections.synchronizedList(new LinkedList<String>());
@Override
public void onLoadingComplete(String imageUri, View view, Bitmap loadedImage) {
if (loadedImage != null) {
ImageView imageView = (ImageView) view;
boolean firstDisplay = !displayedImages.contains(imageUri);
if (firstDisplay) {
displayedImages.add(imageUri);
}
}
}
}
您可以尝试使用 Volley
库的 NetworkImageView
而不是允许您 setImageUrl
的 ImageView
。 ImageLoader
与之相关联的缓存图像下载任何 URL
并且可以重复使用。获取有关其 image cache. You could find decent tutorial here and here 的更多信息。它应该使您的 ListView
图像正确加载。
当谈到从 URL 加载图像时,一个好的方法是使用像 Picasso 这样的库(按方形),它可以很好地处理下载和缓存,它是有很好的记录和维护,调用非常简单,所以它会节省你的时间和仇恨,例如:
Picasso.with(context).
load(url).
fit().
transform(trans). // if you want any transformations..
centerCrop().
error(R.drawable.error_avatar). // in case of error
into(myImageView);
另一个选项是 Fresco(由 Facebook 开发人员开发),但我对它的第一手经验较少。
希望对您有所帮助。
我正在开发一个社交网络应用程序,我必须在其中从服务器获取用户的详细信息。我在参数中获取用户的个人资料图像 url,但我在获取图像和显示它时遇到问题,因为每次它在 Imageview 中只显示图像 url。
这是我的 api 供稿:-
{"post_id":"559",
"userid":"11",
"content":"\u0908\u092e\u093e\u0928\u0926\u093e\u0930\u0940 \u090f\u0915 \u092c\u094b\u0939\u094b\u0924 \u092e\u0939\u0902\u0917\u0940 \u091a\u0940\u095b \u0939\u0948.... \u0917\u093f\u0930\u0947 \u0939\u0941\u090f \u0932\u094b\u0917\u094b \u0938\u0947 \u0909\u0938\u0915\u0940 \u0909\u092e\u094d\u092e\u0940\u0926 \u0928\u0939\u0940\u0902 \u0915\u0930\u0928\u0940 \u091a\u093e\u0939\u093f\u090f..",
"favorite_count":"1",
"reply_count":"2",
"repost_count":"0",
"post_location":"",
"created_date":"2015-05-29 12:04:28",
"name":"devraj singh","user_image":"http:\/\/sabakuch.com\/public\/images_upload\/avatars\/ozone\/11_30_11149322_10205781000956557_74437511307260696_n.jpg",
"post_images":null,
"gender":"1"}
这是我的适配器 class,我从中获取详细信息。
public class OzoneAdapter extends BaseAdapter{
ArrayList<Ozone_Beans> feedList;
LayoutInflater inflater;
Activity activity;
Context context;
ImageLoader imageloader;
public OzoneAdapter(ArrayList<Ozone_Beans> feedList, Activity activity) {
// TODO Auto-generated constructor stub
super();
this.feedList = feedList;
this.activity = activity;
inflater = (LayoutInflater )activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
imageloader = ImageLoader.getInstance();
imageloader.init(ImageLoaderConfiguration.createDefault(activity));
}
@Override
public int getCount() {
// TODO Auto-generated method stub
return feedList.size();
}
@Override
public Object getItem(int position) {
// TODO Auto-generated method stub
return feedList.get(position);
}
@Override
public long getItemId(int position) {
// TODO Auto-generated method stub
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
// TODO Auto-generated method stub
View vi = convertView;
ViewHolder holder;
if(convertView==null)
//convertView = inflater.inflate(R.layout.ozone_item, null);
convertView = inflater.inflate(R.layout.ozone_item, null);
holder = new ViewHolder();
holder.tvDate = (TextView)convertView.findViewById(R.id.ozone_name);
holder.tvContent = (TextView)convertView.findViewById(R.id.ozone_content);
holder.tvUser = (TextView)convertView.findViewById(R.id.ozone_date);
holder.image_user_image = (ImageView)convertView.findViewById(R.id.ozone_user_image);
holder.postImage = (ImageView)convertView.findViewById(R.id.ozone_post_image);
holder.tvUser.setText(feedList.get(position).getName());
holder.tvDate.setText(feedList.get(position).getCreated_date());
holder.tvContent.setText(feedList.get(position).getContent());
//imageloader.displayImage(feedList.get(position).getUser_image(), holder.image_user_image);
//imageloader.displayImage(feedList.get(position).getUser_image(), holder.image_user_image);
//holder.image_user_image.setImageURI(feedList.get(position).getUser_image());
// imageloader.displayImage(feedList.get(position).getTweet_images(), holder.postImage);
return convertView;
}
public class ViewHolder {
public ImageView image_user_image;
public ImageView postImage;
TextView tvContent , tvUser, tvDate;
}
}
看看这个尝试在你的代码中实现
class Holder {
TextView tv1, tv2, tv3;
ImageView iv1, iv2;
public Holder(View v) {
tv1 = (TextView) v.findViewById(R.id.textView);
tv2 = (TextView) v.findViewById(R.id.textView2);
tv3 = (TextView)v.findViewById(R.id.tvCouponDeal);
iv1 = (ImageView)v.findViewById(R.id.imageView3);
iv2 = (ImageView)v.findViewById(R.id.imageView4);
}
}
class MyAdapter extends ArrayAdapter<String> {
Context context;
private ImageLoadingListener animateFirstListener;
public MyAdapter(Context context, int resource) {
super(context, resource);
this.context = context;
}
@Override
public int getCount() {
return categoryList.size();
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View dataRow = convertView;
Holder holder = null;
if (dataRow == null) {
LayoutInflater inflater = (LayoutInflater) getActivity().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
dataRow = inflater.inflate(R.layout.category_items_cell, parent, false);
holder = new Holder(dataRow);
dataRow.setTag(holder);
} else {
holder = (Holder) dataRow.getTag();
}
holder.tv1.setText(categoryList.get(position).getMerchantName());
holder.tv2.setText(categoryList.get(position).getVoucherOfferlogo());
holder.tv3.setText(categoryList.get(position).getOffertype());
if(categoryList.get(position).getIsexclusive().equals("1"))
holder.iv2.setImageResource(R.drawable.fav_selected);
ImageLoader.getInstance().displayImage(categoryList.get(position).getMerchantStanderedimage(), holder.iv1, options, animateFirstListener);
return dataRow;
}
}
private static class AnimateFirstDisplayListener extends SimpleImageLoadingListener {
static final List<String> displayedImages = Collections.synchronizedList(new LinkedList<String>());
@Override
public void onLoadingComplete(String imageUri, View view, Bitmap loadedImage) {
if (loadedImage != null) {
ImageView imageView = (ImageView) view;
boolean firstDisplay = !displayedImages.contains(imageUri);
if (firstDisplay) {
displayedImages.add(imageUri);
}
}
}
}
您可以尝试使用 Volley
库的 NetworkImageView
而不是允许您 setImageUrl
的 ImageView
。 ImageLoader
与之相关联的缓存图像下载任何 URL
并且可以重复使用。获取有关其 image cache. You could find decent tutorial here and here 的更多信息。它应该使您的 ListView
图像正确加载。
当谈到从 URL 加载图像时,一个好的方法是使用像 Picasso 这样的库(按方形),它可以很好地处理下载和缓存,它是有很好的记录和维护,调用非常简单,所以它会节省你的时间和仇恨,例如:
Picasso.with(context).
load(url).
fit().
transform(trans). // if you want any transformations..
centerCrop().
error(R.drawable.error_avatar). // in case of error
into(myImageView);
另一个选项是 Fresco(由 Facebook 开发人员开发),但我对它的第一手经验较少。
希望对您有所帮助。