2011-05-12 6 views
2

오늘 Android의 ArrayAdapter를 배웠고 매번 findViewById를 호출하는 대신 ViewHolder를 사용하여 Views의 참조를 보유하는 commom 패턴이 있음을 확인합니다.ViewHolder 패턴이 작동하는 이유는 무엇입니까?

하지만 어떻게 작동합니까? 어댑터는 대개 View (Group)의 목록을 표시하는 데 사용됩니다. View를 캐시하면 가장 오래된 것을 모두 참조하지 않는 이유는 무엇입니까?

답변

13

ViewHolder의 작동 방식에 대한 가장 좋은 설명을 원한다면 Romain Guy의 Google I/O 2009 이야기, youtube (특히 처음 15 분)을 확인하십시오.

요약하면 Adapter은 기본 데이터와 ViewGroup 사이의 링크 역할을합니다. 화면을 채우는 데 필요한만큼 View을 렌더링합니다. 스크롤하거나 View을 밀어내는 다른 이벤트가 화면 밖으로 나오면 Adapter은 올바른 데이터로 채워진 View을 다시 사용하여 화면에 표시됩니다.

getView(int pos, View view, ViewGroup parent) 메서드는 레이아웃에 관계없이 언제든지 오른쪽 View을 사용합니다. 나는 이것의 내부를 알지 못하지만, 관심이 있다면 어떤 어댑터 (예 : ArrayAdapter.java)의 소스 코드를 탐색 할 수있을 것이라고 확신한다.
ViewHolder은 으로 얻은 Views에 대한 포인터 만 유지합니다. 모든 위치에 해당하는 올바른 데이터를 리턴하는 것은 어댑터의 책임입니다.

Romain's presentation의 슬라이드 11에서 13은 내가 쓸 수있는 것보다 훨씬 명확합니다.

+0

유익하고 멋진 비디오를 가리켜 주셔서 감사합니다. –

0

나는 (우리는 하나 개의 항목 만보기 유형이 고려) 목록보기 아래 작업이 같은 것입니다 믿습니다

한 번 수행

inflate item view from layout, cache it 

반복 모든 항목에 대해 :

ask adapter to fill the data into the view 
draw the view on the screen 
move to next item 

그래서 xml 레이아웃에서 팽창 된 뷰를 가지며 여러 목록 항목을 그릴 때 다시 사용할 수 있습니다. ViewHolder는 getViewById 조회를 저장하여 좀 더 빠르게 처리합니다.

+0

하나의보기 만 있도록 다른 점 (예 : TextView)으로 데이터를 채우는 방법은 무엇입니까? –

+0

@Lai Yu-Hsuan 첫 번째 항목을 가져 와서 어댑터의 모든 데이터를 textFields 등으로 채우고이보기를 그리며 다음 항목으로 이동하고 반복합니다. 모든 항목에 대해 별도의보기 개체가있을 필요는 없습니다 그거 –

+0

오, 알았어. 그래서 우리는보기를 재사용 : 하나의 인스턴스, 여러 번 그려, 라이? 그래서 뷰 ​​계층 구조에서 뷰에 액세스 할 수 없다고 생각합니까? –

1

죄송하지만 denis의 대답이 잘못되었을 수 있습니다. 실제로 뷰 인스턴스 (및 ViewHolders)는과 같이 화면이 표시 될 수있는만큼 입니다. 당신은보기 4 개 인스턴스를 가질 것

[list view] 
the first item 
the second item 
the third item 
the fourth item 

: 같은

은 화면이 보이는 경우. 화면을 스크롤하면 첫 번째 항목이 사라지지만 getItem()에 convertView으로 전달하여 다섯 번째 항목을 만들 수 있습니다.

첫 번째 ViewHolder에서 참조를 사용할 수 있습니다.

+0

즉, 첫 번째 항목을 그리는 동안 ListView는 'convertView'로 전달하는 것보다보기를 생성합니다. 'getItem'에서 같은'convertView'를 돌려 주면 두 번째 항목을 렌더링하는 동안 다시 동일한 뷰가 나타납니다. :) 두 개의 뷰가 없습니다. 맞습니까? –

+0

그건 내가 잘못한 것 같아. 적어도 # android-dev에서 들었던 것을 비난했다. 뷰가 사라진 후에 만 ​​뷰를 재사용합니다. 따라서 화면이 한 항목보다 큰 경우 첫 번째보기를 사용하여 두 번째 항목을 그릴 수 없습니다. 화면에 N 개의 항목이 있으면 N 개의보기가 있습니다. –

+0

소스를보고 난 후에 알고리즘이 쉽고 간단하지 않다고 생각했습니다. 어느 정도의 뷰가 포함되지만 일부 뷰는 재사용 가능하며 일부 뷰는 재사용 할 수 없습니다. 무슨 일이 일어나고 있는지 이해하기 위해 더 많은 것을 파헤쳐 야합니다. –

관련 문제