【发布时间】:2014-01-21 00:00:17
【问题描述】:
在使用一些图像创建 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);
}
}
在这里,我遇到了一个非常奇怪的问题。确实在我的列表视图中,默认图像被替换为......什么都没有。 imageView 正方形保持透明。如果我在日志中检查位图状态,则返回之前的位图状态不为空。我的问题是:当我在 AsyncTask 中得到的 Bitmap 不为空时,为什么我得到一张透明的图片?
注意:无论我在 URL 中输入什么内容,都会发生此问题。
谢谢大家:)
【问题讨论】:
-
这里的问题是在适配器创建视图后调用 asynctask,因此您需要更改适配器源数据然后通知您的数据源进行更改,您可以在创建适配器之前请求图像并在其中使用您的位图列表,或者您可以在图像完成获取图像后更新适配器
-
我应该在我的 AsyncTask 中使用 View.invalidate() 吗?
标签: android listview bitmap android-asynctask adapter