1

ListViewTabHost 안에 있습니다. 네 개의 다른보기를 목록에 반환하는 사용자 정의 CursorAdapter이 있습니다. 4 가지 유형 중 하나는 SD 또는 자산 폴더에서 가져온 이미지입니다. 원래는 CursorAdapter에서 이미지를로드하고 있었기 때문에 각 이미지가로드되는 동안 UI 스레드가 멈추었을 것이므로 코드를 AsyncTask으로 옮겼습니다.asynctask에서 행로드가 커지면 ListView의 크기가 조정되지 않습니다.

이 항목은 모두 매우 짧은 항목 목록이 반환되는 경우를 제외하고는 모두 작동합니다. 이 경우 이미지가로드 된 후 ListView의 크기가 다시 조정되지 않고 맨 위에있는 화면의 작은 부분 만 스크롤 할 수 있습니다.

listView을 다시 레이아웃으로 가져 오는 방법을 알 수 없습니다. 뷰에서 자체 재개 호출 및 무효화가 작동하지 않습니다. View의 부모를 찾으려고하면 null이 반환됩니다. 기본 ListFragment 레이아웃은 이미 높이를 "Match_Parent"로 설정합니다. onCreateView의 레이아웃을 수동으로 모든 높이가 "Match_Parent"로 설정된 레이아웃으로 설정해도 수정되지 않습니다. notifyDataSetChanged()을 호출하기 위해 어댑터 자체를 전달하면 루프가 발생하고 ListView의 크기가 조정되지 않습니다.

내가 탭을 변경하면보기가 새 탭이 그 위에 그려지기 직전에 올바르게 깜박입니다. 매우 때로는 장치를 회전하거나 탭 사이를 가볍게 치면 올바르게 렌더링되지만 대부분의 경우 렌더링되지 않습니다.

디버깅 목적으로 다양한 재 레이아웃 명령을 onListItemClick에 추가하여 ListView.relayout()을 호출 할 때가끔 문제가 해결되지만 종종 그렇지 않은 것으로 나타났습니다. 왼쪽에

는 권리가 메인 쓰레드 로더로드 어떻게에가는 AsyncTask를 함께로드 방법이다. 내용은 왼쪽에 있지만 목록보기의 크기가 잘못되어 스크롤해야합니다.

무엇이 누락 되었습니까? ListView 또는 현재 탭을 표시하거나 화면 전체를 다시 그릴 수있는 방법이 있습니까?

답변

0

ListView를 배치 한 후에 ImageView 크기를 조정하면 문제가 발생합니다. AsyncTask를 회전하기 전에 ImageView의 높이와 너비를 이미지 크기로 설정하면 ListView 레이아웃이 올바르게됩니다.

내 이미지는 db의 파일 이름 등으로 모두 로컬이므로 이미지를로드하기 전에 올바른 크기를 얻을 수 있습니다. 미리 이미지 크기를 얻을 수 없다면 100 % 확신 할 수 없습니다.

+0

비슷한 문제가 발견되었지만 항목보기가 올바르게 레이아웃되지 않은 경우 RelativeLayout을 사용합니다. 컨트롤을 그룹화하면 이미지가 보이고 이미지 자체는 LinearLayout에서 미리 이미지 크기를 쿼리 할 필요없이 문제를 해결했습니다 (SDK는 14). – cbuchart

+0

감사합니다. ImageView는 현재 RelativeLayout의 일부입니다. 나는 그것을 다시 방문 할 때 LinearLayout으로 바꿀 수 있으므로 결국에는 그것이 나오는 방식을별로 좋아하지 않습니다. 모든 이미지 크기를 데이터베이스에 저장할 필요없이 이미지에 대한 이중 액세스를 제거하는 것이 좋습니다. – Andrew

1

자체를 다시 그리기 위해 ListView에 알릴 필요가 있습니다. 이것은 비싸고 그것을 피하려고 노력해야합니다. 또한 스크롤 위치가 계속 변함에 따라 사용자에게 불만을 야기 할 수 있습니다. 이상적인 ImageView 크기를 찾고 행 높이/너비를 잠그면 동적 내용으로 인해 이러한 문제가 발생할 수 있으므로 사용하는 것이 좋습니다.

을해야
arrayAdapter.notfityDataSetChanged(); 

http://developer.android.com/reference/android/widget/ArrayAdapter.html#notifyDataSetChanged()

.

+0

호출 중 arrayAdapter.notifyDataSetChanged(); 문제를 해결하지 못합니다. 그냥 무한 루프를 생성합니다. – Andrew

+0

어디에서 전화 했습니까? asynctask의 onPostExecute 메서드에서 호출하려고한다고 생각합니다. –

+0

정확히 내가 전화를 걸었습니다. 그 목록을 새로 고치고 모든보기를 다시 생성하여 목록 자체를 다시 호출하므로 목록이 모든 항목을 새로 고쳐서 비동기를 다시 호출하여 목록에 표시합니다. ListView 자체가 잘못된 크기라는 사실을 수정하지 않습니다. 나는 약간의 이미지를 올릴 것이다. – Andrew