2012-06-10 3 views
0

Я запускаю этот код (за пределами onCreate, потому что мне нужно сначала получить данные из Интернета), и он останавливается на линии mainView.setAdapter и никогда не переходит к следующему оператору отладки (или загружает данные в этом отношении). Что я делаю не так?Listview берет навсегда для загрузки в эмулятор

private void loadInteractions(JSONArray interactions){ 
    mainView = (ListView) findViewById(R.id.list); 
    myInteractionsTask.cancel(false); 
    String[] interactionsArray=new String[interactions.length()]; 
    for(int interactionCounter=0; interactionCounter<interactions.length();interactionCounter++){ 
     TextView interactionView = new TextView(this); 
     Log.d("Debug", "Loading Interaction #"+interactionCounter); 
     try { 
      Log.d("Debug", "Loading text: "+interactions.getString(interactionCounter)); 
      interactionsArray[interactionCounter]=interactions.getString(interactionCounter); 
      Log.d("Debug", "Done loading text"); 
     } catch (JSONException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
    } 
    mainView.setAdapter(new ArrayAdapter<String>(this, R.id.list, interactionsArray)); 
    Log.d("Debug", "Done loading textView"); 

} 

ответ

1
mainView.setAdapter(new ArrayAdapter<String>(this, R.id.list, interactionsArray)); 

Второй параметр ArrayAdapter конструктор должен быть индивидуальный макет ListView элемент, а не идентификатор самого ListView. Вы проходите R.id.list, который является вашим ListView id.

Попробуйте пройти android.R.layout.simple_list_item_1 вместо этого, который даст вам однострочный макет текста для каждого элемента.

+0

Спасибо, но это по-прежнему возникают проблемы с загрузкой в ​​массиве строк и подходят к этому последним отладочному заявлению ... – smartypantstemple

+0

@smartypantstemple: Примерно сколько строк делают 'interactionsArray' содержать? – Squonk

+0

содержит около 7 строк – smartypantstemple

0

Оказалось, что моя проблема не имела никакого отношения к коду, который я опубликовал. Проблема заключалась в том, что я попытался добавить элементы пользовательского интерфейса во время doInBackground в AsyncTask, и вы никогда не должны этого делать, но вместо этого разместите его в onPostExecute. Я отредактирую сообщение, чтобы показать это. Это окончательный код.

class LoadInteractionsTask extends AsyncTask<String,Integer,Integer>{ 
    JSONArray interactions; 
    boolean loadStatus=false; 

    @Override 
    protected Integer doInBackground(String... params) { 
     // TODO Auto-generated method stub 
     // TODO Auto-generated method stub 
     // Create a new HttpClient and Post Header 
     myLogin.cancel(false); 
     HttpGet httpget = new HttpGet("http://www.example.com/device/get_module_list.php"); 
     Log.d("Debug", "starting loading"); 

     try { 
      // Execute HTTP Post Request 
      HttpResponse response = httpclient.execute(httpget); 
      HttpEntity myentity =response.getEntity(); 
      Log.d("Debug", "response: "+myentity); 

      String loginJSON = EntityUtils.toString(myentity); 
      JSONTokener myTokener =new JSONTokener(loginJSON); 
      //Log.d("Debug", "status: "+myTokener.nextValue()); 


      //JSONObject 
      JSONObject myJSON = (JSONObject) (myTokener).nextValue(); 
      Log.d("Debug", "status: "+myJSON.getInt("status")); 
      if(myJSON.getInt("status")==1){ 
       interactions=myJSON.getJSONArray("modules"); 
       loadStatus=true; 
      }else{ 
       Log.d("Debug", "error: "+myJSON.getString("reason")); 

      } 

     } catch (ClientProtocolException e) { 
      // TODO Auto-generated catch block 
      Log.d("Debug", "caught ClientProtocolException"); 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      Log.d("Debug", "caught IOException: "+e.getMessage()); 
      e.printStackTrace(); 
     } catch (ParseException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } catch (JSONException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
     return null; 
    } 

    protected void onPostExecute(Integer result) { 
     super.onPostExecute(result); 
     if(loadStatus){ 
      loadInteractions(interactions); 
     } 
    } 


}