2011-12-05 5 views
1

에서 무슨 일이 일어나고 있는지 나는이의 getView의 어댑터 확장 재정에 많은 참조 : 나는 의미 무슨 일이 일어나고 있는지 얻을정확히의 getView

@Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     View v = convertView; 
     if (v == null) { 
      LayoutInflater vi = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
      v = vi.inflate(R.layout.whatever, null); 
     } 

- "convertView가 null의 경우 다음을 부풀려",하지만 난 정말하지 않습니다 이해 왜 - convertView가 null 일까, 어떤 상황에서 이미 View가 될까?

도 마찬가지지만 위의 내용과 관련하여 - 팽창 방식 중에 정확히 무엇이 발생합니까? 나는 그것이 일반적으로 무엇을 알고 ("팽창"뷰 리소스를 구문 분석하고 인구가 될),하지만 그것을 완전히 grok 수없는 ... 전체 내용

TYIA

+0

어댑터는 AdapterView에서 사용됩니다 ... AdapterView의 일부 구현 (AbsListView 및 기타) getView를 사용하여 ... 잘 ...보기, 어댑터 항목에 대한 ...이 구현에 많은 최적화가 ... 그래서 AbsListView (및 기타) 새보기를 만들지 않지만 오히려 사용하지 않는 재사용. .. 내 말은하지만 "사용하지 않는"의미는 ... 예제를 보여 드리겠습니다 ... ListView에는 약 100 개의 요소가 있어야하지만 ListView는 convertView를 사용하여 fx getView를 호출하므로 한 번에 5 개만 표시됩니다. == null == 약 7 회 null 다음 convertView로 사용하지 않은 것을 가리 키려고합니다. – Selvin

답변

3

목록 어댑터에 1000 개의 개체가 있다고 가정 해보십시오. 각 객체는 뷰로 표시됩니다. 전화 화면에는 10 가지의보기 만있을 수 있습니다. 당신은 더 많은 항목을보고 싶은 목록을 스크롤합니다. 스크롤하는 동안 일부 항목이 보이지 않게됩니다. 프레임 워크가 방금 보지 못했던 것과 똑같기 때문에 더 많은 뷰를 생성하는 것은 의미가 없습니다. 프레임 워크는 이전에 만든 일부보기를 다시 사용할 수 있으므로 null이 아닌 convertView을 제공하여 이러한 가능성을 제공합니다.

inflate 메서드 중에 View 개체가 일부 XML 리소스에서 만들어집니다. XML 리소스에는 해당 뷰가 생성되기에 충분한 뷰에 대한 설명이 있으므로 inflate 메서드가 해당 뷰를 작성합니다. 그래서보기가 없습니다 - 당신은 팽창시켜 새로운 것을 만들었습니다. 이미보기가 있습니다 - 재사용 할 수 있습니다 (꼭해야 할 필요는 없습니다)

+0

위대해, 고마워. – momo

2

난 당신이 video 를 시청하는 것이 좋습니다 그것은 당신에게 많은 정보를 알려줍니다. 무엇이 일어나고 있는지를 알려줍니다. getView()

+1

좋은 비디오, 매우 유익한 - 링크 덕분에 – momo

8

AFAIK 이것은 getView가 작동하는 방식입니다.

50 개 항목으로 구성된 목록이 있고 한 번에 5 개 항목 만 볼 수 있다고 가정 해보십시오. getView는 처음에 5 번 호출되며 convertView는 각 행에 대해 null이되고 새 행은 팽창됩니다.

목록을 스크롤하면 다음 행이 화면에 표시 될 때 getView가 다시 호출됩니다. 이제 목록에 5 개의 행이 이미 렌더링되었으므로 기존 행을 새 값으로 업데이트하여 새 행을 표시하여 이러한 행을 재활용합니다. 이 경우 convertView는 null이 될 수 없습니다.

+0

+1 좋은, 명확한 대답을 위해 ... 나는 Alex 이후 받아 들였다. 두 가지 질문을 다뤘습니다 ... 그리고 그는 당신이 할 수있는 것보다 더 많은 것을 사용할 수 있습니다 :) – momo

+0

확실히 Blessenm의 대답은 훨씬 더 명확하고 정확합니다 - 이것에 전심으로 동의합니다. 나는이 답변에 대해서도 upvoted했고,이 답변이 부정확 한 광산 대신에 받아 들여질 수 있다면 그것은 정말 위대 할 것입니다. –

관련 문제