在自己的BaseAdapter里面开启异步任务获取Bitmap,如何setImageBitmap()
public class FoodAdapter extends BaseAdapter {
private Context mContext;
private List<Food> mData;
public FoodAdapter(Context context, List<Food> data) {
mContext = context;
mData = data;
}
@Override
public int getCount() {
return mData.size();
}
@Override
public Food getItem(int position) {
return mData.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder viewHolder = null;
if (convertView == null) {
convertView = LayoutInflater.from(mContext).inflate(R.layout.fragment_index_goodlist_item,parent,false);
viewHolder = new ViewHolder(convertView);
viewHolder.findViews();
convertView.setTag(viewHolder);
} else {
viewHolder = (ViewHolder) convertView.getTag();
}
Food food = mData.get(position);
//获取Bitmap并加载ImageView
MyAsynTask.BitmapAsyncTask bitmapAsyncTask = new MyAsynTask.BitmapAsyncTask(food.getImg());
bitmapAsyncTask.execute();
bitmapAsyncTask.setOnDataFinishedListener(new MyAsynTask.OnDataFinishedListener() {
@Override
public void onDataSuccess(Object result) {
// (Bitmap) result;
FoodAdapter.super.notifyDataSetChanged();
}
@Override
public void onDataFailure() {
Toast.makeText(mContext, "加载图片失败",Toast.LENGTH_SHORT).show();
}
});
//加载其他控件
viewHolder.mTvName.setText(food.getName());
viewHolder.mTvDescription.setText(food.getDescription());
viewHolder.mTvPrice.setText("¥"+food.getPrice());
viewHolder.mTvAction.setText(food.getAction());
viewHolder.mTvCount.setText("已售:"+food.getCount());
return convertView;
}
private class ViewHolder {
ImageView mIvImg;
TextView mTvName, mTvDescription, mTvPrice, mTvAction, mTvCount;
View mView;
public ViewHolder (View view){
this.mView = view;
}
private void findViews() {
mIvImg = mView.findViewById(R.id.id_iv_img);
mTvName = mView.findViewById(R.id.id_tv_name);
mTvDescription = mView.findViewById(R.id.id_tv_description);
mTvPrice = mView.findViewById(R.id.id_tv_price);
mTvAction = mView.findViewById(R.id.id_tv_action);
mTvCount = mView.findViewById(R.id.id_tv_count);
}
}
}在上面内部方法onDataSuccess(Object result)中,如何调用viewHolder去设置已经获得的(Bitmap)result呢?或许只能用Handler来处理?
public class MyAsynTask {
//获取JSON中的照片
public static class BitmapAsyncTask extends AsyncTask<String, Void, Bitmap> {
private String mUrl;
private OnDataFinishedListener onDataFinishedListener;
public BitmapAsyncTask(String url) {
this.mUrl = url;
}
public void setOnDataFinishedListener(OnDataFinishedListener onDataFinishedListener) {
this.onDataFinishedListener = onDataFinishedListener;
}
@Override
protected Bitmap doInBackground(String... strings) {
InputStream in = null;
try {
URL url = new URL(strings[0]);
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setRequestMethod("GET");
connection.setConnectTimeout(5000);
if (connection.getResponseCode() == HttpURLConnection.HTTP_OK) {
in = connection.getInputStream();
Bitmap bitmap = BitmapFactory.decodeStream(in);
in.close();
return bitmap;
}
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (in != null)
in.close();
} catch (IOException e) {
e.printStackTrace();
}
}
return null;
}
@Override
protected void onPostExecute(Bitmap bitmap) {
super.onPostExecute(bitmap);
if (bitmap != null) {
onDataFinishedListener.onDataSuccess(bitmap);
} else {
onDataFinishedListener.onDataFailure();
}
}
}
public interface OnDataFinishedListener {
public void onDataSuccess(Object result);
public void onDataFailure();
}
}20
收起
正在回答 回答被采纳积分+1
1回答
2.Android 网络操作与流行框架
- 参与学习 人
- 提交作业 220 份
- 解答问题 1800 个
本阶段是联网及数据处理的必备技能。课程从网络基础知识到线程间协同工作、异步下载处理;从文件存储、到轻量级数据库SQLite的使用;最后利用最流程的第三方框架助你快速开发企业级APP。
了解课程

恭喜解决一个难题,获得1积分~
来为老师/同学的回答评分吧
0 星