在使用某些图像创建Listview的方法中,我决定使用AsyncTask来获取图像。所以我的代码是这样的:
private class StableArrayAdapter extends ArrayAdapter<Request>{
private Context context;
private Bitmap tempobmp;
final User myUser = myapp.getUser();
private List<Request> mylist;
public StableArrayAdapter(Context context,List<Request> mylist){
super(context, R.layout.request_layout, mylist);
this.context = context;
this.mylist = mylist;
}public class ViewHolder{
public ImageView image;
}
public View getView(int position,View convertView,ViewGroup parent){
View vi = convertView;
if(vi==null){
final Integer positionInt = position;
final ViewHolder holder = new ViewHolder();
LayoutInflater inflater = (LayoutInflater) context
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
vi = inflater.inflate(R.layout.request_layout,parent,false);vi.findViewById(R.id.totalLisV);
holder.image = (ImageView) vi.findViewById(R.id.requestImage);
vi.setTag(holder);
}
final ViewHolder holder = (ViewHolder) vi.getTag();
final Request s = mylist.get(position);
final User tempoUser = new User(s.getAsking_user().getUsername());
tempoUser.fetch(new StackMobModelCallback(){
@Override
public void failure(StackMobException e) {
// the call failed
}
@Override
public void success() {
// TODO Auto-generated method stub
}
});
new GetImageData().execute(tempoUser,vi);
return vi;
}
在获取此图像的方式中,魔法必须发生在下面的AsyncTask中(目前我正在使用硬编码的url进行测试):
private class GetImageData extends AsyncTask<Object, Void, Bitmap> {
private View myView;
private Bitmap bmp = null;
@Override
protected Bitmap doInBackground(Object... users) {
User user =(User) users[0];
myView = (View)users[1];
Bitmap bmp = null ;
try{
String urlString = "http://digital-photography-school.com/wp-content/uploads/2013/03/Acorn256.png";
URL url = new URL(urlString);
InputStream is = (InputStream) url.getContent();
bmp = BitmapFactory.decodeStream(is);
}
catch(Exception e){
Log.d("asykException","asykE"+e);
}
return bmp;
}
protected void onPostExecute(Bitmap result) {
ImageView albumArt = (ImageView) myView.findViewById(R.id.requestImage);
albumArt.setImageBitmap(bmp);
}
}
在这里,我遇到了一个非常奇怪的问题。确实在我的listview中,默认图像被替换为......没有。 imageView方块保持透明。如果我在返回之前检查日志中的位图状态,那么这个状态是非空的。我的问题是:当我在AsyncTask中获得的位图不为空时,为什么我会得到一个透明的图片?
注意:无论我在网址中添加什么内容,都会发生此问题。
谢谢你们:)
答案 0 :(得分:1)
您想从Internet获取图片,请使用以下代码:
URL url = new URL(imgurl);
URLConnection con = url.openConnection();
con.connect();
InputStream is = con.getInputStream();
Bitmap bitmap = BitmapFactory.decodeStream(is);
is.close();
现在你得到Bitmap对象,只在ImageView上显示。就是这样。
答案 1 :(得分:1)
请勿致电AsyncTask
课程中的Adapter
。我认为这不是好的做法加上getView()
可能在您的任务完成之前返回。因此,请从Activity
调用该任务,然后在onPostExecute()
中初始化Adapter
并将其设置在ListView
上。或者,如果您已初始化Adapter
,则可以在notifyDataSetChanged()
的{{1}}上致电Adapter
。
答案 2 :(得分:1)
不需要使用notifyDatasetChange,因此适配器会将新内容添加到列表视图中,请在此处查看更多详细信息 Is ArrayAdapter thread safe in android? If not, what can I do to make it thread safe?
但是这种方法对你需要更快地使你的列表视图更有帮助,所以这里有一些提示如何以更快的方式将图像附加到listview第3节)加载本文的图像
此处Lib将帮助您以更快的方式下载listview上的图像 https://github.com/nostra13/Android-Universal-Image-Loader
希望这能帮到你