2011-10-21 14 views
1

次のコードを使用して、XMLファイルを開き、その情報をListViewで表示します。
コードの最初の部分にProgressDialogを含めました。ファイルのロードが完了するまでそれを表示し、ロードされるとProgressDialogが消えるまで表示します。
問題は、ファイルが既に読み込まれているときにProgressDialogが表示されていることです。ファイルがロードされ、ロードが完了すると、リストビューが表示され、同時にProgressDialogが表示されるまで画面は黒です。
私を助けてください。
おかげロードXMLファイルの前にprogressDialogを表示

public class Main extends ListActivity { 
/** Called when the activity is first created. */ 
@Override 
public void onCreate(Bundle savedInstanceState) { 

    super.onCreate(savedInstanceState); 

    final ProgressDialog _progressDialog = new ProgressDialog(this); 
    _progressDialog.setIcon(R.drawable.icon); 
    _progressDialog.setTitle("Loading ..."); 
    _progressDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER); 

    runOnUiThread(new Runnable() { 

     @Override 
     public void run() { 
      _progressDialog.show(); 
      Thread t = new Thread() { 
        public void run(){ 
         GetData(); 
         _progressDialog.dismiss(); 
        } 
        }; 
        t.run(); 
     } 
    }); 

} 

public boolean GetData() { 

    ArrayList<HashMap<String, String>> mylist = new ArrayList<HashMap<String, String>>(); 

    setContentView(R.layout.listplaceholder); 

    String xml = XMLfunctions.getXML(); 
    Document doc = XMLfunctions.XMLfromString(xml); 

    int numResults = XMLfunctions.numResults(doc); 

    if((numResults <= 0)){ 
     Toast.makeText(Main.this, "Geen resultaten gevonden", Toast.LENGTH_LONG).show(); 
     finish(); 
    } 

    NodeList nodes = doc.getElementsByTagName("result"); 

    for (int i = 0; i < nodes.getLength(); i++) {       
     HashMap<String, String> map = new HashMap<String, String>();  

     Element e = (Element)nodes.item(i); 
     map.put("id", XMLfunctions.getValue(e, "id")); 
     map.put("name", "Naam:" + XMLfunctions.getValue(e, "name")); 
     map.put("Score", "Score: " + XMLfunctions.getValue(e, "score")); 
     mylist.add(map);    
    }  

    ListAdapter adapter = new SimpleAdapter(this, mylist , R.layout.main, 
        new String[] { "name", "Score", "name" }, 
        new int[] { R.id.item_title, R.id.item_subtitle, R.id.item_subtitle2 }); 

    setListAdapter(adapter); 

    final ListView lv = getListView(); 
    lv.setTextFilterEnabled(true); 
    lv.setOnItemClickListener(new OnItemClickListener() { 
     public void onItemClick(AdapterView<?> parent, View view, int position, long id) {    
      @SuppressWarnings("unchecked") 
      HashMap<String, String> o = (HashMap<String, String>) lv.getItemAtPosition(position);     
      Toast.makeText(Main.this, "ID '" + o.get("name") + "' was clicked.", Toast.LENGTH_LONG).show(); 

     } 
    }); 

    return true; 
} 
} 

答えて

1

使用AsyncTaskonPreExecute()で進行状況ダイアログを示しています。あなたができた新しいフラグメントのAPIを使用する準備ができたりではないという事実によって

public class Main extends ListActivity { 
/** Called when the activity is first created. */ 
@Override 
public void onCreate(Bundle savedInstanceState) { 

    super.onCreate(savedInstanceState); 

    final ProgressDialog _progressDialog = new ProgressDialog(this); 
    _progressDialog.setIcon(R.drawable.icon); 
    _progressDialog.setTitle("Loading ..."); 
    _progressDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER); 

    new AsyncTask<Void, Void, Void>() { 
    protected Long doInBackground(Void ... urls) { 
     GetData(); 
    } 

    protected void onPostExecute(Void result) { 
     _progressDialog.dismiss(); 
    } 

    protected void onPreExecute(Void no) { 
     _progressDialog.show(); 
    } 

    }.execute(); 

} 
+0

私に助けてくれてありがとう; – maxoya

+0

問題! doInBackgroundでGetData()関数を使用すると、アプリケーションは強制終了します!なぜ?! – maxoya

+0

@maxoya - 私が持っているはずの 'GetData()'を見なかったのは私のせいです。 GetData'機能をAsyncTaskに統合するので、バックグラウンドスレッド(例えばdoInBackground)ではなくUIスレッド(例えばonProgressUpdate、onPostExecuteなど)からUIを変更することはありません。 – MByD

0

も(ListFragmentを拡張しますandroid compatibility packageを使用)、setListShown(boolean)を使用してください。私はLoaderManager.LoaderCallbacksでこれを多く使用します<カーソル>(あなたと全く同じコンテキストではなく、おそらくAsyncTaskLoaderを使用できます)。

とにかく:AsyncTaskレスポンスの+1。

関連する問題