2013-04-28 2 views
3

Android 파일보기 앱의 코드를 수정하고 사소한 수정을 수행 한 후 매우 이상한 상황이 발생했습니다.setSelectionFromTop가 작동하지 않는 경우가 있습니다.

이 응용 프로그램은 ListView에서 파일 시스템보기를 지원하며 사용자가 다른 디렉토리를 탐색 할 때마다이 ListView를 다시 읽습니다. 하위 디렉토리를 입력하기 전에 현재 ListView 위치가 스택에 저장되고 사용자가 하위 디렉토리에서 돌아 오면 위치 정보가 스택에서 팝되어 이전 위치를 복원 할 수 있습니다.

사용자가 부모에 하위 디렉토리에서 다시 이동 한 후 내가 당신에게 그것을 수행하는 원래의 단계를 보여 드리죠, 그것은 새로 고침 perfrom하기 위해 AsyncTask를 사용하십시오 onPreExecute에서

  1. () 메소드를, 현재 파일 목록 인 mFileNameList가 비게되고 notifyDataSetChanged() 작업이 수행됩니다. doInBackground() 메서드에서

  2. 의 경우 부모 폴더의 파일 목록이 수집되어 목록에 저장됩니다. onPostExecute() 메소드에

  3. 는 수집 된 목록은 mFileNameList에 넣어, 및 notifyDataSetChanged() 호출 이후 setSelectionFromTop()는 서브 폴더를 입력하기 전에 이전 위치의 목록보기 둘 것이다.

이러한 메커니즘은 소스 코드를 유지하기 전에 잘 작동합니다. 그러나이 과정에서 사소한 단점을 발견했습니다. onPreExecute()에서 목록이 비워지기 때문에 ListView는 파일 목록을 표시하기 전에 비어있게됩니다.

그런 코드가 필요하지 않으므로 첫 번째 단계를 제거했습니다. 그러나 테스트 후 setSelectionFromTop()이 ListView의 위치를 ​​더 이상 지정하지 않는다는 것을 알았습니다. 사용자가 하위 디렉토리에서 돌아올 때마다 ListView는 항상 이전 위치가 아닌 위치 0에서 목록을 표시합니다.

이것은 파일 목록을 표시하고 원래 위치를 복원하는 코드 단편이지만 mFileListView.setSelectionFromTop (item.pos, item.top)은 더 이상 작동하지 않습니다.

@Override 
protected void onPostExecute(ArrayList<FileInfo> result) { 
    mFileNameList.clear(); 
    mFileNameList.addAll(result); 
    sortCurrentList(sort); 

    // other code 

    PathSelectionItem item = mFileViewInteractionHub.getLastPathListSelectionItem(); 
    if (item != null && item.path.equals(
     mFileViewInteractionHub.getCurrentPath())) { 
     mFileListView.setSelectionFromTop(item.pos, item.top); 
    } 

내가 백엔드 스택을 기록했으며 스택에 오류가 없음을 발견했습니다. 실제로 setSelectionFromTop()을 호출하기 전에 setAdapter()를 호출 할 수 있으며 버그가 수정됩니다. 하지만 왜 setAdapter가 트릭을 할 것인지 모르겠습니다.

아무도 무슨 일이 있었는지 말할 수 있습니까? 감사.

답변

0

setSelectionFromTop(int, int) 어댑터가 설정되지 않으면 작동하지 않습니다. 소스 코드를 보면이를 확인할 수 있습니다. (API level 19를) 다음과 같은 방법의 시작은 읽

public void setSelectionFromTop(int position, int y) { 
    if (mAdapter == null) { 
    return; 
    } 

    // [...] 
} 

그것은 어떤 어댑터가 설정되어 있지 않은 경우는 아무것도하지 않고 반환합니다.

관련 문제