我有一个列表适配器,可以扩展列表。在方法getView()
上,我创建了一个AscyncTask
来从互联网上获取图像。但是,我发现调用方法getView()
的原因有很多,不仅仅是为了扩充列表。
我的问题是:如何知道何时调用该方法来扩充列表?每次调用该方法时我都不想创建AsyncTask
。
这是我的代码:
public class ListItem extends ArrayAdapter<Carro> {
private final Activity context;
private final List<Carro> carros;
public ListItem(Activity context, List<Carro> carros) {
super(context, R.layout.list_item, carros);
this.context = context;
this.carros = carros;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
LayoutInflater inflater = context.getLayoutInflater();
View rowView = inflater.inflate(R.layout.list_item, null, true);
TextView modelo = (TextView) rowView.findViewById(R.id.modelo);
modelo.setText(carros.get(position).getModelo());
GetFoto getFoto = new GetFoto(rowView);
getFoto.execute(position);
return rowView;
}
private class GetFoto extends AsyncTask<Integer, Void, Void> {
Drawable fotoDraw;
View rowView;
int position;
public GetFoto(View view) {
this.rowView = view;
}
@Override
protected Void doInBackground(Integer... params) {
position = params[0];
HTTPHandler handler = new HTTPHandler();
fotoDraw = handler.makeServiceCallImage(carros.get(position).getFoto());
return null;
}
@Override
protected void onPostExecute(Void aVoid) {
ImageView imagem = (ImageView) rowView.findViewById(R.id.imagem);
imagem.setImageDrawable(fotoDraw);
}
}
}
答案 0 :(得分:1)
每次在滚动过程中视图出现在屏幕上时,都会调用方法getView()
。如果getView()
高度设置为ListView
,则wrap_content
方法调用的数量可能大于元素数。
使用Picasso
或Glide
等库来下载图片。这些库将缓存下载的图像,以防止不必要的请求。
看起来像这样:
Glide.with(context)
.load(imageUrl)
.into(imageView);
或者您可以阅读这篇文章https://developer.android.com/topic/performance/graphics/cache-bitmap.html
我建议使用RecyclerView
代替ListView
。它回收了防止多次通胀的观点
答案 1 :(得分:0)
像Alex Nik所说的那样:使用毕加索或滑行来拍照。 并且停止使用ListView,它们有点被弃用,但仍然受支持。使用RecyclerView,它更好,更容易使用。