0

OK, 내 SD 카드의 이미지를 액티비티 ListView에 표시하려고합니다.SimpleCursorAdapter.setViewImage를 사용할 때 호출의 라이프 사이클

많은 힌트를 읽고 있지만 중요한 덩어리를 놓치고 있습니다. 나는 이것을 보여 주며 아직 아무것도 발견하지 못했던 짧은 소스 코드를보고 싶다.

내 연구에서 bindview()listview.setadapter(SimpleCursorAdapter adapter)이 실행될 때 호출됩니다. 문서에 따르면 ViewBinderImageView을 처리 할 수없는 경우 은 bindview에 의해 호출됩니다. 당신은 FROM 배열의 필드를 지정

TO 배열의 TextViewidCursorTextView와 뷰 그룹. 그런 다음 어댑터를 ListView으로 설정하면 문제가 발생합니다.

나는 호출 순서는 다음 생각 : listView.setAdapter(SimpleCursorAdapter adapter)->adapter.bindView()->adapter.setTextView

의 Bindview 뷰 유형 and text value from the cursor and setTextView`이 일을 TextView, determine that it can bind it, passes the 텍스트 뷰입니다 결정해야합니다.

이렇게하면 ImageView과 매우 비슷합니다. 맞습니까? bindView가 건너와 유형 ImageView의 객체 때

listViw.setAdapter(SimpleCursorAdapter adapter)->adapter.bindView()->adapter.setImageView 

그래서, 무슨 일을합니까? setTextView과 같은 기본 구현이 있습니까? 나는 그것을하는 것이 어려울 것이라고 상상할 것입니다, 이미지는 매우 다양합니다. 텍스트는 텍스트이지만 이미지의 형식, 크기, 깊이, 크기, 위치 등이 있습니다. setTextView에 전달 된 문자열은 페이로드 텍스트입니다. 이미지에서 문자열은 파일 이름 (아마도)이며 이미지의 시작점 만됩니다.

FROM에 파일 이름이 들어있는 데이터베이스 열 이름으로 어댑터를 만들어야한다고 생각합니다. TO 배열은 내 레이아웃에 ImageView의 ID 만 갖습니다. 기본 뷰 바인더 bindview() 사용할 수 있지만 예상 된 문자열 (파일 이름) 걸릴 setImageView() 무시해야하며 예상되는 응용 프로그램 경로에서 해당 이미지 이름을 찾을 수있는 이미지로드 선을 빌드합니다.

그래서 (아마도)입니다 :

listView.setAdapter(MyOwnSimpleCursorAdapter myOwnAdapter)->myOwnAdapter.super.bindView()->myOwnAdapter.setImageView() 

이 사운드 권리를합니까? 누락 된 틈을 메우거나 작업 소스 코드를 제공하면 도움이 될 것입니다. 그건 그렇고, 내가 이렇게 코드를 작성했습니다,하지만 작동하지 않습니다. 그것은 매우 간단한 버그 일 수 있고 가능하다면이 스레드를 멈추고 싶지 않습니다. 나는 그저 올바른 방향으로 조금 움직여야한다고 생각합니다.

답변

4

내가 확실히 무엇을 귀하의 질문에 (그리고 그래, 당신은 코드의 실패 조각을 게시해야한다) 이해하지 못한다는 그래서 여기 내 대답이다 (당신은 또한 SimpleCursorAdapter의 소스 코드에서 볼 수 있습니다) :

에 새로운 View이 필요하면 getView()이 표시되는 SimpleCursorAdapter에서이 메소드는 행 건물을 newView() (사용자가 설정 한 xml 레이아웃을 부풀게하는 View)을 만들고 to 배열에서 idsView의 배열로 태그를 설정하고 bindView()newView()에 의해 생성 된 View에 실제로 데이터를 바인딩합니다.

bindView()는 데이터 바인딩에합니다 (to 배열에서 id S와 S View) View (S)의 어레이를 통해 반복한다. 또한 커서를 통해 getString (getString 메서드 만 호출)을 호출하여 데이터를 가져옵니다. 다음으로이 메소드는 어댑터에 ViewBinder이 설정되어 있는지 확인합니다.이 경우 ViewBinder이 데이터를 설정하게합니다. ViewBinder이 데이터를 성공적으로 바인딩하면 메서드 setTextView()setImageView()이 호출되지 않습니다.

ViewBinder은 다음 bindView() 방법을 확인하고 (TextView 또는 ImageView에 대해 다루고 있습니다 View의 유형을 볼 어댑터 또는 false합니다 (ViewBinder를 의미하는 것은 실패)를 ViewBinder 반환의 setViewValue 방법에 설정되지 않은 경우) setViewText() 또는 setViewImage()을 호출하십시오.

setViewImage()의 구현은 int (예 : 화상 ID R.drawable.image)로 공급되는 문자열을 해석하려고하며이 실패 할 경우 그 다음 UriString을 파싱하고 ImageViewsetImageUri()를 사용한다. 따라서 또는 String ("file://mnt/sdcard/photo100.jpg")과 같은 intSimpleCursorAdapter의 기본 구현으로 작동해야하며 그렇지 않은 경우 setImageView을 재정의하십시오.

+0

훌륭한 답변을 주셔서 감사합니다. 특히 내 질문을 찾기가 어렵다는 것을 고려하면 더욱 그렇습니다. 문제는 다소 "이 소리가 맞습니까?" getView() 및 newView() 호출에 대해 알지 못했지만 setViewImage가 매우 유용하다는 점에 대한 추가 세부 정보가 있습니다. 아직 소스 코드에 대한 답변을 얻지 못했습니다. 설명서 만 있습니다. 또 다른 좋은 팁 ... – JustSomeGuy

+0

내 코드도 실패하지 않았다. 당연히 어떤 이미지도 표시되지 않았다. 이것은 데이터베이스에서 반환 된 문자열이 Uri의 "photo100.jpg"대 "file : //mnt/sdcard/photo100.jpg"가 아닌 단지 파일 이름 이었기 때문입니다. 이미지의 전체 경로를 저장하는 것으로 전환합니다. 여러 위치에서 이미지를 지원하기로 결정한 경우에 더 유용 할 것입니다. – JustSomeGuy