私はリストを膨らませるList Adapterを持っています。メソッドgetView()
で私はAscyncTask
をインターネットから画像を取得します。しかし、私は、getView()
というメソッドが、リストを膨らませるだけでなく、さまざまな理由で呼び出されていることを理解しました。Android - リストを膨らませるためにgetViewが呼び出されたときを知る方法
私の質問は、メソッドを呼び出してリストを膨らませるときを知る方法ですか?メソッドが呼び出されるたびにAsyncTask
を作成したくありません。 getView()
ビューがスクロール処理中に画面に表示されるたびに呼び出されます
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);
}
}
}
私はあなたが「リストを膨らませる」ことが何を意味するのだろうと思っています。さらに、getView()が呼び出される理由の1つだけを知っているので、いくつか言及しておくと、さまざまな理由があります。 – greenapps
読み込みたいすべての画像に対して非同期タスクを作成する必要があります。 getView()が必要とするたびにダウンロードした画像をキャッシュしない場合は、上下にスクロールしながら再度ダウンロードする必要があります。 – greenapps
たとえば、アダプタに2つのアイテムのリストがある場合、getView()メソッドは8回のように呼び出されます。メソッドが呼び出されるたびに、リスト自体には8個の項目がなくてもasyncTaskが作成されます。リスト項目が行になるときだけAsyncTaskを呼び出す –