답변:
행 마다 다른 유형 의보기를 원하는 경우를 처리합니다 . 예를 들어, 연락처 애플리케이션에서 행에도 왼쪽에 그림이 있고 홀수 행에 오른쪽에 그림이있을 수 있습니다. 이 경우 다음을 사용합니다.
@Override
public int getViewTypeCount() {
return 2;
}
@Override
public int getItemViewType(int position) {
return position % 2;
}
프레임 워크는 뷰 유형을 사용 하여 메소드 에서 처리 할 뷰를 결정 합니다.convertViewgetView . 즉, 위의 예에서 짝수 행은 재사용 할 수 있도록 왼쪽에 그림이있는 재활용 뷰만 가져오고 홀수 행은 오른쪽에 그림이있는 뷰만 가져옵니다.
목록의 모든 행이 동일한 레이아웃을 갖는 경우 뷰 유형에 대해 걱정할 필요가 없습니다. 실제로 BaseAdapter.java 는 모든 어댑터에 대한 기본 동작을 제공합니다.
public int getItemViewType(int position) {
return 0;
}
public int getViewTypeCount() {
return 1;
}
이것은 실제로 모든 행에 대해 동일한 뷰 유형을 제공합니다.
편집 -일반적인 흐름을 설명합니다.
AdapterView어댑터를 사용하여 데이터를 바인딩합니다 .AdapterView시도는 사용자가 볼 수있는 항목을 표시합니다.getItemViewType할 행인 row를 호출 n합니다.n유형 의 뷰를 확인 합니다. 뷰가 아직 재활용되지 않았기 때문에 아무것도 찾지 못했습니다.getViewrow를 호출합니다 n.getItemViewType하기 위해 행 n을 호출 합니다.getView하고 종료 하면 행의 뷰가 사용자에게 표시됩니다.이제 화면을 스크롤하여보기를 재활용하면 프레임 워크에서 관리하는 재활용보기 풀로 이동합니다. 이들은 본질적으로 뷰 유형별로 구성되므로 메소드의 convertView매개 변수에서 올바른 유형의 뷰가 제공됩니다 getView.
getItemViewType표시하려는 행을 호출 합니다.convertView매개 변수 로 전달됩니다 getView.우리가보기의 다른 유형 표시해야하는 경우 사용 후의 좋은 목록을-보기 getViewTypeCount()와 getItemViewType()보기를 전환하는 대신 어댑터 View.GONE와 View.VISIBLE매우 비싼 작업 내부 될 수 있습니다 getView()목록 스크롤에 영향을 미칠 것입니다.
어댑터 사용 getViewTypeCount()및 getItemViewType()어댑터에 대해서는이 항목을 확인하십시오 .
조심해 !!!!
나는 구현 문제에 직면했다ListView어제 스크롤 한 직후에 행에 대한 두 가지 유형의보기가 뒤죽박죽되었습니다. 이 스레드 내에서 가장 많이 투표 된 답변은 일반적인 설명을 제공하지만 위에서 언급 한 위의 UI 버그를 막기 위해 가장 중요한 정보는 강조하지 않았습니다.
여기 내 설명입니다
모두 getViewTypeCount()와 getItemViewType()사용중인 BaseAdapter의 getView방법은 재활용 및 반환, 인출해야 뷰의 종류를 확인합니다. (스레드 내의 맨 위 답변에 설명되어 있음). 그러나 Android API Doc에 따라이 두 가지 방법을 직관적으로 구현하지 않으면 위에서 언급 한 문제가 발생할 수 있습니다.
구현에 대한 요약 지침 :
여러 행 유형에 Views대해 ListView행을 구현하려면 기본적으로 구현해야 getItemViewType()하며 getViewTypeCount()메소드가 있습니다. 그리고 getItemViewType()문서는 우리에게 다음과 같은 메모를 제공합니다.
참고 : 정수의 범위에 있어야
0로getViewTypeCount() - 1.IGNORE_ITEM_VIEW_TYPE반환 할 수도 있습니다.
따라서 getItemViewType()0에서 시작하여 마지막 유형으로 (유형 수-1)로 뷰 유형의 값을 반환해야합니다. 예를 들어, 세 가지 유형의보기 만 있다고 가정 해 봅시다. 따라서 뷰의 데이터 객체에 따라 0 기반 배열 인덱스와 같이 메소드 에서 0 또는 1 또는 2 만 반환 할 수 getItemViewType()있습니다. 세 가지 유형의 뷰가 사용되므로 getViewTypeCount()메서드는 3을 반환해야합니다.
어쨌든이 방법에 대해 1, 2, 3 또는 111, 222, 333과 같은 다른 정수 값을 반환하면 Android API Doc을 따르지 않고 위의 UI 버그가 발생할 수 있습니다.
실마리를 얻지 못했거나 여전히 해결할 수없고 추가 정보가 필요한 경우이 StackOverflow Q & A 스레드 내에서 자세한 답변을 읽으십시오 .
힌트를 찾을 수있는 자세한 정보 는 Android 개발자 문서 를 참조하십시오.
이 답변이 많은 시간을 절약하기 위해 거기에있는 누군가에게 도움이되기를 바랍니다.
건배!!!
IGNORE_ITEM_VIEW_TYPE내 ListView 중 하나에 버그가 있다고 언급 해 주셔서 감사합니다 . ArrayAdapter를 사용하여 1 개의 이미지와 2 개의 텍스트보기로 구성된보기를 삽입했습니다. 뷰 유형이 하나뿐이었습니다. getItemViewType 메서드를 재정의하지 않거나 위치 또는 하드 코딩 된 정수를 반환하여 재정의하려고했습니다. 모든 경우에, 나는 스크롤 할 때 이상한 행동으로 목록에 중복이 발생했습니다 (중복 변경). IGNORE_ITEM_VIEW_TYPE이 방법 으로 돌아와서 문제가 해결되었습니다. 감사.