Android - 如何知道何时调用getView来扩充列表

时间:2017-11-06 20:17:08

标签: android listview 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 个答案:

答案 0 :(得分:1)

每次在滚动过程中视图出现在屏幕上时,都会调用方法getView()。如果getView()高度设置为ListView,则wrap_content方法调用的数量可能大于元素数。

使用PicassoGlide等库来下载图片。这些库将缓存下载的图像,以防止不必要的请求。

看起来像这样:

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,它更好,更容易使用。