2017-10-22 3 views
1

私はファイル選択ダイアログとして使用しているAlertDialogのインスタンスを持っています。これには階層ブラウジング機能が含まれています。ディレクトリがリストから選択されている場合は、そのディレクトリ内のファイルのリストが表示されます。また、前のフォルダに戻る「上のレベル」ボタンも含まれています。私は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(); 
       } 
      } 
     } 
    }); 

これは古いダイアログを破棄し、階層ツリー・トラッキング・アレイと関連するポインタを更新し、新しいパスとの対話をrelaunches。私の望むよりもはるかに複雑ですが、うまく機能します。私は誰かがこれが有用であると願っています!

0

あなたは、アダプタ内のデータを更新したら、あなたはAdapter.notifyDatasetChangedを呼び出す必要がありhttps://developer.android.com/reference/android/widget/BaseAdapter.html#notifyDataSetChanged()

notifyDatasetChanged を呼び出してリストを更新するUIを通知しなければなりません。

+0

ListViewのアダプタへの参照を取得し、notifyDatasetChangedメソッドを使用できるバリアントにキャストする必要があるため、配列の代わりにArrayAdapterを使用するために初期宣言コードを再設定する必要がありますAlertDialogのBuilderのリスト設定メソッドに与えられた値? –

+0

@MichaelRunzler次のyourDialogInstance.getListView()。getAdapter()。notifyDataSetChanged()を使用することをお勧めしますか? –

+0

ですが、.getListView()。getAdapter()を呼び出すと、notifyDataSetChanged()メソッドを持たないListAdapter型のオブジェクトが返されます。それはBasicAdapterのサブクラスのようですので、それをキャストしてnotifyDataSetChanged()を呼び出してみましたが、エラーは発生しませんが実際には何もしないようです。このメソッドを実行するには、カプセル化された型のListAdapterを生成するために元のアダプタがどのようなものであるのかを知る必要があります。私はまだそれを見つけることができませんでした... –

関連する問題