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
, 첫 번째와 마지막 항목의 해시 코드입니다 때마다 교환. 이 문제의 원인은 무엇일까요?
'ListView'에 대한 것입니까? 이 경우'ListView'는 기존 뷰를 재활용합니다. 즉'convertView '가 사용됩니다. 'convertView'가'null'이 아닌 경우 새로운'View'를 반환하기 위해 그것을 사용해야합니다. – Squonk
예, 이것은 Listview입니다. Ok ... 이것은 까다 롭습니다. 즉, getView()가 호출 될 때마다 setTag()를 호출해야합니다. 나는 convertView가 null 일 때만 그것을하고 있었다 !! 나는 그것이 실수라고 생각한다. – nayan