2017-10-22 16 views
1

파일 선택 대화 상자로 사용하고있는 AlertDialog의 인스턴스가 있습니다. 여기에는 계층 적 탐색 기능이 포함됩니다. 디렉토리가 목록에서 선택되면 해당 디렉토리에있는 파일 목록이 표시됩니다. 그것은 또한 이전 폴더로 돌아가는 'up level'버튼을 포함합니다. 대화 상자가 빌더에서 대화 상자 객체를 다시로드하지 않고 표시되는 동안 AlertDialog 객체의 기본 제공 ListView 내용을 업데이트하는 방법이 필요합니다. 어댑터가 존재한다는 것을 알고 있지만 외부 XML 자원이 아닌 정의 된 인스턴스 변수에서 데이터를로드하는 방법이 필요합니다. 단추 누르기에서 대화 상자가 닫히지 않도록 onResume 메서드를 재정의하고 있으며 목록 업데이트를 실행해야합니다.실행 중 AlertDialog의 ListView 내용 업데이트

이것은 onResume 메소드 안에있는 선택 버튼의 OnClick 수신기에 대한 코드입니다.

 
alertDialog.getListView().setOnItemClickListener(new AdapterView.OnItemClickListener() { 
      @Override 
      public void onItemClick(AdapterView parent, View view, int position, long id) { 
       if(position >= 0) 
       { 
        String[] list = getCurrentFileList(); 

        if(list[position].equals(NO_ITEMS_TEXT)){ 
         return; 
        } 

        // If the selected file is a directory, recursively update the file list and redisplay. 
        if(getCurrentFileRefList()[position].isDirectory()){ 
         src = getCurrentFileRefList()[position]; 
         parseFileList(); 
         //todo update ListView from loaded file list 
        }else { // If the selected item is a file, give the value to the handler and dismiss the dialog. 
         handler.handleEvent(DialogActionEventHandler.ResultID.SUBMITTED, getCurrentFileRefList()[position]); 
         alertDialog.dismiss(); 
        } 
       } 
      } 
     }); 

parseFileList(); 방법은 선택한 소스 파일에서 파일의 현재 목록을 가져 오는 데 사용됩니다.

도움을 주시면 감사하겠습니다. 당신이 어댑터의 데이터를 업데이트 한

답변

0

결국 해결 방법으로 문제를 해결했습니다. notifyDatasetChanged() 메서드는 초기 생성 단계에 대한 전체 어댑터 클래스를 만들지 않고 대화 상자에 대한 업데이트를 올바르게 푸시하지 않았으므로 (시간이 많이 걸리고 내 용도에 비효율적이라고 여겼던) 저는이 문제를 해결하기 위해 대화 상자를 열고, 사용자가 폴더를 바꿀 때마다 업데이트되는 포인터가있는 ArrayList를 사용하여 소스 트리를 기준으로 마스터 트리에서 현재 디렉토리의 위치를 ​​추적합니다. 또한이 프로세스에서는 onCreate() 메서드를 다시 실행 인식하고 onResume() 메서드를 수동으로 호출 할 수 있도록 설정해야했습니다. 이 작업이 완료 된 후, 코드의 결과 섹션에서는이처럼 보였다 :

alertDialog.getListView().setOnItemClickListener(new AdapterView.OnItemClickListener() { 
     @Override 
     public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 
      if(position >= 0) 
      { 
       String[] list = getCurrentFileList(); 

       if(list[position].equals(NO_ITEMS_TEXT)){ 
        return; 
       } 

       // If the selected file is a directory, recursively update the file list and redisplay. 
       if(getCurrentFileRefList()[position].isDirectory()){ 
        src = getCurrentFileRefList()[position]; 
        hierarchyID ++; 
        onCreateDialog(null); 
        alertDialog.dismiss(); 
       }else { // If the selected item is a file, give the value to the handler and dismiss the dialog. 
        handler.handleEvent(DialogActionEventHandler.ResultID.SUBMITTED, getCurrentFileRefList()[position]); 
        alertDialog.dismiss(); 
       } 
      } 
     } 
    }); 

이 이전 대화를 삭제 계층 구조 트리 추적 배열 및 관련 포인터를 업데이트하고 새로운 경로 대화 상자를 다시 실행합니다. 그것은 내가 바라던 것보다 훨씬 더 복잡하지만 잘 작동한다. 나는 누군가가 이것을 유용하게 찾길 바래!

0

당신은 notifyDatasetChanged https://developer.android.com/reference/android/widget/BaseAdapter.html#notifyDataSetChanged()

를 호출하여 목록을 업데이트 할 수있는 UI를 통보해야합니다, 당신은 Adapter.notifyDatasetChanged를 호출해야합니다.

+0

ListView의 어댑터에 대한 참조를 얻고이를 notifyDatasetChanged 메서드를 사용할 수있는 변형으로 캐스팅해야하므로 배열에 대한 대신 ArrayAdapter를 사용하도록 초기 선언 코드를 다시 정의해야합니다. AlertDialog의 빌더에서리스트 설정 메소드에 주어진 값? –

+0

@MichaelRunzler 다음의 yourDialogInstance.getListView(). getAdapter(). notifyDataSetChanged()?를 사용하는 것이 좋습니다. –

+0

하지만, .getListView(). getAdapter()를 호출하면 notifyDataSetChanged() 메서드가없는 ListAdapter 유형의 객체가 반환됩니다. 그것은 BasicAdapter의 하위 클래스 인 것 같습니다. 그래서 그것을 캐스팅 해보고 notifyDataSetChanged()를 호출했지만 오류가 발생하지는 않지만 실제로 아무 것도하지 않는 것 같습니다. 그 방법을 실행하기 위해서는 캡슐화 된 타입의 ListAdapter를 생성하기 위해 원래의 어댑터가 무엇인지 알아야하고, 아직 발견 할 수 없었습니다 ... –