0

사용자 정의 레이아웃에 5 개의 자식 View 개체 (4 TextView 및 1 CheckBox)가있는 사용자 지정 레이아웃을 사용하는 ListView이 있습니다. 그러나 TextViews 만 바인딩됩니다. CheckBox에는 데이터베이스에 해당 필드가 없습니다. CheckBox의 목적은 단순히 "다음 단계"에서 처리하고 싶은 항목을 식별하는 것입니다. DB 값의 일부가 날짜 등 때문에 텍스트 값을 올바르게 지정하기 위해 사용자 정의 ViewBinder을 사용하고 있습니다.ListView의 모든 항목에 대해 바인딩되지 않은 자식보기를 업데이트하는 방법은 무엇입니까?

사용자 인터페이스의 일부에는 목록의 각 항목의 상태를 전환하는 데 사용하는 '모두', '없음'및 '뒤집기'버튼이 있습니다. '모든'버튼의 경우, 예를 들어, 나는 다음과 같은 코드를 사용하여이 작업을 수행 할 (내가 지금 알고 정확하지 - 내가 할 노력하고있어 보여 그것을 포함)이 잘 작동

ListAdapter la = getListAdapter(); 
ListView lv = getListView(); 
int iCount = la.getCount(); 
for(int i=0; i<iCount; i++) 
{ 
    View vv = lv.getChildAt(i); 
    CheckBox cb = (CheckBox) vv.findViewById(R.id.ledgerItemCheckBox); 
    cb.setChecked(true); 
} 

목록의 항목 수가 목록 크기를 초과하지 않는 한 모든 항목이 항상 표시됩니다. 이 숫자를 초과하면 'getChildAt'함수가 null을 반환하는 경우가 있는데 (정확하게 이해할 경우) 목록에있는 모든 항목을 반환하지 않고 표시되는 항목 만 반환하기 때문에 (NullPointerException) .

표시되지 않는 경우에도 모든 뷰에 대해 CheckBox을 올바르게 설정하는 방법은 무엇입니까?

+0

SimpleAdapter 또는 SimpleCursorAdapter를 사용하고 있습니까? –

+0

SimpleCursorAdapter –

답변

1

TextView 데이터 중 하나에 의사 바인딩을 생성하고 체크 상자의 백엔드로 Boolean 객체의 ArrayList를 만듭니다. ArrayList는 응용 프로그램에 가장 적합한 데이터 구조가 아닐 수 있습니다. ArrayList를 Cursor의 데이터 세트의 해당 위치의 초기 값으로 설정된 부울로 채 웁니다. 바인딩 할 때 ArrayList를 백엔드 데이터로 사용하십시오. all, none 또는 invert를 선택하면 ArrayList의 Boolean 객체를 업데이트 한 다음 SimpleCursorAdapter에서 notifyDataSetChanged()를 호출합니다.

덧붙여 아, 문제의 나머지 절반은 그렇습니다. 예, CheckBox에는 onClickListener를 사용하지만 동일한 수신기를 사용하고 각각에 대해 새 개체를 만들지 마십시오. getPositionForView() 메서드를 사용하여 위치를 얻고 기본 데이터를 업데이트하십시오.

+0

확실히 잘 작동했기 때문에이 대답을 수락했습니다! 감사! 어쩌면 당신은 나에게 반대 질문에 대한 단서를 줄 수 있습니다. 개별 항목에 대한 체크 상자를 클릭하면이를 감지하여 어떻게 부울 논리 []를 업데이트 할 수 있습니까? ListView OnItemClickListener를 설정해도 도움이되지 않습니다. 어쩌면 필드 중 하나에서 텍스트를 설정하는 동안 모든 항목에 대해 onClickListener를 설정해야합니까? –

+0

후반에 업데이트되었습니다. –

+0

완벽하게 작동합니다! 흥미로운 사실은 getPositionForView가 부모 컨테이너 (실제 ListView 항목) 대신 CheckBox 자체를 전달할 때 잘 작동한다는 점입니다. 또한 OnCheckedChangedListener를 사용하여이 작업을 처음 시도했는데 실제로는 전혀 이해가되지 않는 실제 문제가있었습니다. 청취자는 항상 '없음'을 클릭 할 때 호출되지만 '반전'을 클릭했을 때 두 코드 간의 코드 차이는 간단하지 않지만 (= false vs =! isChecked()). 무슨 일이 있었는지 (어쩌면 재귀 호출 정크)는 확실하지 않지만 일단 OnClickListener로 전환하면 잘 작동합니다. 다시 한 번 감사드립니다! –