2017-11-06 15 views
0

私はリストを膨らませる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); 
     } 
    } 
} 
+0

私はあなたが「リストを膨らませる」ことが何を意味するのだろうと思っています。さらに、getView()が呼び出される理由の1つだけを知っているので、いくつか言及しておくと、さまざまな理由があります。 – greenapps

+0

読み込みたいすべての画像に対して非同期タスクを作成する必要があります。 getView()が必要とするたびにダウンロードした画像をキャッシュしない場合は、上下にスクロールしながら再度ダウンロードする必要があります。 – greenapps

+0

たとえば、アダプタに2つのアイテムのリストがある場合、getView()メソッドは8回のように呼び出されます。メソッドが呼び出されるたびに、リスト自体には8個の項目がなくてもasyncTaskが作成されます。リスト項目が行になるときだけAsyncTaskを呼び出す –

答えて

1

方法:

は、ここに私のコードです。 getView()のメソッド呼び出しの数は、の高さがwrap_contentに設定されている場合、要素の数より大きくなることがあります。

画像をダウンロードするにはPicassoまたはGlideのようなライブラリを使用してください。これらのライブラリは、不要な要求を防ぐダウンロードされたイメージをキャッシュします。

それは次のようになります。

Glide.with(context) 
    .load(imageUrl) 
    .into(imageView); 

それとも、https://developer.android.com/topic/performance/graphics/cache-bitmap.html

この記事を読むことができ、私はRecyclerView代わりのListViewを使用することをお勧めします。それは、複数のインフレを防ぐビューをリサイクルする

0

Alex Nikは言ったように:ピクチャロードのためにピカソまたはグライドを使います。 ListViewの使用をやめると、廃止されましたがまだサポートされています。 RecyclerViewを使用すると、より使いやすくなります。

関連する問題