2011-09-14 6 views
0

내 응용 프로그램을 디버깅하고 listview를 스크롤 할 때 BaseAdapter 클래스의 getView() 메서드가 호출되어 새로운 뷰가 생성되는 것을 보았습니다Base adapter.getview() 메서드가 호출 될 때 ListView가 느려짐

public View getView(int position, View convertView, ViewGroup parent) { 
    Article article = this.articles.get(position); 
    return new MainView(this.context, articulo.getTitle() , articles.getDescription(),articles.getImgUrl());) } 

이 작업을 수행 할 때 listActivity를 스크롤하면 ListActivity가 느리게 처리되는 결과가 발생하여 목록보기 항목을 새로 만들 때이 메서드가 다시 호출됩니다. 모든 방법을 만들 수 있습니까? 항목을 한 번보고 ListActivity를 스크롤 할 때 ListItem을 만들지 마십시오.

답변

2

의 ListView는 높은 성능을 위해 최적화되어있다, 당신은 많은 ListItems를 캐시하여 ListAdapter 내부 ViewHolder를 사용해야합니다.

규칙이 먼저있는 CustomView를 설정 http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/view/List14.html

검사, 당신의 홀더 내부의 모든 것을 포장하고보기에이 홀더를 고정, 두 번째 뷰는 안드로이드 간단한 추출물을 홀더 정보를 사용 (정말 빨리) .

0

getView를 호출 할 때마다 새보기를 작성하지 마십시오. 전달 된 convertView를 사용하면 기존 View를 다시 사용할 수 있습니다. 이 경우 MainView의 인스턴스가됩니다. 그래서 당신은 같은 것을 할 수 있습니다

MainView mv; 
if (convertView != null){ 
    mv = (MainView) convertView; 
    ((TextView) mv.findViewById(R.id.title)).setText(articulo.getTitle()); 
    // similar for description and imgUrl 
} else { 
    mv = new MainView(...); 
} 
return mv; 

또한, 당신은 미셸에 의해 제안 ViewHolder 패턴을 사용할 수 있습니다. 이렇게하면 제목 등을 설정할 때 findViewById 조회를 피할 수 있습니다. Here is a great explanation of ViewHolder.

관련 문제