0

ファイルの名前を取得して o リストに表示したいのですが、エラーが発生します

 ls=sftpChannel.ls("/home/volkan/");

                     l.setAdapter(new BaseAdapter() {

                         public View getView(int position, View convertView,
                                ViewGroup parent) {
                             view= new TextView(parent.getContext());

                             l.post(new Runnable() {
                                 public void run() {
                                     for(int i=0;i<ls.size();i++){
                                            view.setText(((LsEntry)ls.get(i)).getFilename());
                                            return;}
                                 }
                             });
                            return null;
                        }
                        public int getCount() {
                             return ls.size();
                        }

                        public Object getItem(int position) {
                            // TODO Auto-generated method stub
                            return null;
                        }

                        public long getItemId(int position) {
                            // TODO Auto-generated method stub
                            return 0;
                        }



                     });

11-06 15:45:00.955: E/AndroidRuntime(18820): FATAL EXCEPTION: Thread-1344 11-06 15:45:00.955: E/AndroidRuntime(18820): android.view.ViewRootImpl$CalledFromWrongThreadException: 元のスレッドのみビュー階層を作成したものは、そのビューに触れることができます。11-06 15:45:00.955: E/AndroidRuntime(18820): android.view.ViewRootImpl.checkThread(ViewRootImpl.java:4267) 11-06 15:45:00.955: E/AndroidRuntime(18820): Android で。 view.ViewRootImpl.invalidateChild(ViewRootImpl.java:855) 11-06 15:45:00.955: E/AndroidRuntime(18820): android.view.ViewRootImpl.invalidateChildInParent(ViewRootImpl.java:904) 11-06 15:45: 00.955: E/AndroidRuntime(18820): android.view.ViewGroup.invalidateChild(ViewGroup.java:4005) 11-06 15:45:00.955: E/AndroidRuntime(18820): android.view.View.invalidate(View) で.java:8716) 11-06 15:45:00.955: E/AndroidRuntime(18820):

4

2 に答える 2

0

コードのこのセクションをどこから呼び出していますか? エラー メッセージによると、UI スレッドとは異なるものを使用しています。これはあなたの問題を引き起こします...

Adapter の実装も壊れており、getView は position パラメータによって参照されるビューを返す必要があります。

public View getView(int position, View convertView, ViewGroup parent) {
    final View view = new TextView(parent.getContext());
    l.post(new Runnable() {
        view.setText(((LsEntry)ls.get(position)).getFilename());
    });
    return view;
}

しかし、解決済みのファイル名をキャッシュする必要があるため、これはまだ醜いです...より良いアプローチは、別のスレッドでファイル名のマッピングを行い、その結果が得られた場合はアダプターを設定することです。それはあなたの仕事をかなり簡素化するでしょう...

于 2012-11-06T14:24:41.467 に答える
0

別のスレッドから UI を更新することはできません。私はあなたのコードを更新しました。確認してください..

 ls=sftpChannel.ls("/home/volkan/");

l.setAdapter(new BaseAdapter() {

public View getView(int position, View convertView,
       ViewGroup parent) {
    view= new TextView(parent.getContext());  
    view.setText(((LsEntry)ls.get(position)).getFilename());
    return view;
}
public int getCount() {
    return ls.size();
}

public Object getItem(int position) {
   // TODO Auto-generated method stub
   return null;
}

public long getItemId(int position) {
   // TODO Auto-generated method stub
   return 0;
}

});
于 2012-11-06T14:14:57.813 に答える