Android - Как узнать, когда вызывается getView для раздувания списка
У меня есть список адаптер, который раздувает список. По методу 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);
}
}
}
2 ответа
Метод 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
, Это переработка взглядов, которая предотвращает множественную инфляцию
Как сказал Алекс Ник: используйте Picasso или Glide для загрузки изображений. И прекратите использовать ListViews, они устарели, но все еще поддерживаются. Используйте RecyclerView, это лучше и проще в использовании.