2012-01-12 2 views
1

ArrayAdapter에서 확장 한 사용자 정의 ContactListAdapter를 작성했습니다. 목록에 단지 세 가지 요소 만 있다고 가정 해 봅시다. 나는 getView()의 각 호출에서받은 View 객체의 위치와 해시 코드를 출력하고있다. 뷰 객체가 올바르게 반환되지 않는 것을 관찰했습니다. 내가 여기서 뭔가 잘못하고있는거야?Android : getView()가 올바른 View 객체를 반환하지 않습니다.

private class ContactListAdapter extends ArrayAdapter<ContactItem> { 
... ... 
    @Override 
    public View getView(int aPosition, View aConvertView, ViewGroup aParent) { 
     Log.d(TAG, "Inside ContactListAdapter.getView()"); 
     if(aConvertView==null) { 
      Log.d(TAG, "ConvertView is null"); 
      // Inflate view... 
     } 
     Log.d(TAG, "Pos: " + aPosition + " View: " + aConvertView.hashCode()); 
     return aConvertView; 
    } 

다음은 초기 뷰 생성에 대한 로그입니다 :

D/ContactsActivity( 759): Inside ContactListAdapter.getView() 
D/ContactsActivity( 759): ConvertView is null 
D/ContactsActivity( 759): Pos: 0 View: 1156974184 
D/ContactsActivity( 759): Inside ContactListAdapter.getView() 
D/ContactsActivity( 759): ConvertView is null 
D/ContactsActivity( 759): Pos: 1 View: 1157007416 
D/ContactsActivity( 759): Inside ContactListAdapter.getView() 
D/ContactsActivity( 759): ConvertView is null 
D/ContactsActivity( 759): Pos: 2 View: 1157027832 

그리고이 목록에 세 번째 요소를 클릭 로그 (첫 번째와 마지막 요소의 해시 코드를 교환하는 방법을 주목하라). 내 온 클릭 메소드는 각 목록 항목에 몇 개체 수 있습니다 :

D/ContactsActivity( 759): Inside ContactListAdapter.getView() 
D/ContactsActivity( 759): Pos: 0 View: 1157027832 
D/ContactsActivity( 759): Inside ContactListAdapter.getView() 
D/ContactsActivity( 759): Pos: 1 View: 1157007416 
D/ContactsActivity( 759): Inside ContactListAdapter.getView() 
D/ContactsActivity( 759): Pos: 2 View: 1156974184 

내가 두 번째 요소를 클릭 로그 :이 반복적으로 관찰

D/ContactsActivity( 759): Inside ContactListAdapter.getView() 
D/ContactsActivity( 759): Pos: 0 View: 1156974184 
D/ContactsActivity( 759): Inside ContactListAdapter.getView() 
D/ContactsActivity( 759): Pos: 1 View: 1157007416 
D/ContactsActivity( 759): Inside ContactListAdapter.getView() 
D/ContactsActivity( 759): Pos: 2 View: 1157027832 

, 첫 번째와 마지막 항목의 해시 코드입니다 때마다 교환. 이 문제의 원인은 무엇일까요?

+0

'ListView'에 대한 것입니까? 이 경우'ListView'는 기존 뷰를 재활용합니다. 즉'convertView '가 사용됩니다. 'convertView'가'null'이 아닌 경우 새로운'View'를 반환하기 위해 그것을 사용해야합니다. – Squonk

+0

예, 이것은 Listview입니다. Ok ... 이것은 까다 롭습니다. 즉, getView()가 호출 될 때마다 setTag()를 호출해야합니다. 나는 convertView가 null 일 때만 그것을하고 있었다 !! 나는 그것이 실수라고 생각한다. – nayan

답변

3

convertView는 어댑터보기의보기를 다시 사용하기 때문에 목록을 표시 할 때 한 번에 5 줄씩 표시 할 수 있고 5 줄로보기를 만들 때 convertView는 null로 유지되지만 스크롤 할 때 어댑터가 어댑터보기에 대한 새보기를 작성하므로 위치 1의 목록 재사용보기에서 여섯 번째 요소가 작성됩니다.

+0

그렇다면 ViewHolder 관용구가 어떻게 작동하는지. 예를 들어, setTag()를 사용하여 뷰의 각 요소에 별도의 데이터를 저장하려고합니다. – nayan

+0

ViewHolder에 의해 어댑터 뷰에서 뷰의 뷰 객체를 가져 와서 각 뷰에 새 값을 설정하므로 두 행 모두 다른 뷰를 사용하고있는 것처럼 보입니다. – jeet