2017-11-06 5 views
0

나는리스트를 부 풀리는 List Adapter를 가지고있다. 방법 getView()에서 나는 AscyncTask을 만들어 인터넷에서 이미지를 얻습니다. 그러나, 나는 방법을 getView() 수많은 이유뿐만 아니라, 목록을 부풀리기 위해 호출 알아 냈어.안드로이드 - 목록을 부풀리기 위해 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()가 호출되는 이유 중 하나만 알면 여러 가지 이유 중 몇 가지를 언급 ​​할 수 있습니다. – greenapps

+0

로드하려는 모든 그림에 대해 비동기 작업을 만들어야합니다. 그리고 getView()가 원할 때마다. 다운로드 한 사진을 캐시하지 않으면 위아래로 스크롤하면서 다시 다운로드해야합니다. – greenapps

+0

예를 들어, 어댑터에 2 개의 항목이있는 List가있는 경우 getView() 메서드는 8 번 호출됩니다. 메서드가 호출 될 때마다 목록 자체에 8 개의 항목이 없더라도 asyncTask가 만들어집니다. 목록 항목이 행이 될 때만 AsyncTask를 호출하려고합니다. –

답변

1

방법 :

여기 내 코드입니다. getView() 메서드 호출의 수는 높이가 wrap_content으로 설정된 경우 요소 수보다 클 수 있습니다.

Picasso 또는 Glide과 같은 일부 라이브러리를 사용하여 이미지를 다운로드하십시오. 이러한 라이브러리는 불필요한 요청을 방지하는 다운로드 된 이미지를 캐시합니다.

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

을 또는 당신은 내가 RecyclerView 대신 ListView의 사용을 권장이 문서를 https://developer.android.com/topic/performance/graphics/cache-bitmap.html

을 읽을 수 있습니다

은 다음과 같이 표시됩니다. 그것은 다중 인플레이션을 방지하는 견해를 재활용합니다.

0

알렉스 닉은 다음과 같이 말했습니다 : 그림로드를 위해 피카소 또는 글라이드를 사용하십시오. 그리고 ListView 사용을 중단하십시오. 그들은 더 이상 사용되지 않지만 여전히 지원됩니다. RecyclerView를 사용하면 사용하기가 더 쉽고 편리합니다.