2011-08-25 230 views
1

我有一个应用程序,它拥有一个viewflipper,可以在整个应用程序中始终查看标签,并在标签下方显示一个列表视图。我试图用Web服务器中的JSON字符串填充列表视图,Web服务器以以下格式提供JSON字符串:[“X”,“Y”,“Z”] 所以基本上,我想要在列表视图中列出不同行上的每个字符串。Android Listview未填充JSON字符串

该应用程序启动正常,列表视图看起来是空的。 这是我使用的教程:http://inchoo.net/mobile-development/android-development/simple-android-json-parsing-example-with-output-into-listactivity/ 以下是完整的代码主要开展的活动:

public class Activity extends TabActivity implements OnClickListener { 

    Button doSomething; 
    TabHost tabHost; 
    ViewFlipper flipper; 
    ListView listview; 
    HttpResponse re; 
    String json; 
    JSONObject j; 




    @SuppressWarnings({ "deprecation", "unchecked", "rawtypes" }) 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 


     super.onCreate(savedInstanceState); 



     setContentView(R.layout.tablayout_1); 




     doSomething = (Button) findViewById(R.id.btn_do_something); 
     doSomething.setOnClickListener(this); 

     flipper = (ViewFlipper) findViewById(R.id.layout_tab_one); 

     listview = (ListView) findViewById(R.id.listview); 







     //@SuppressWarnings("unchecked") 
     ListAdapter adapter = new ArrayAdapter(this,android.R.layout.simple_list_item_1,this.fetch()); 



     listview.setAdapter(adapter); 

     flipper.setOnClickListener(this); 

     String tabname1 = getString(R.string.tabexample_tab1); 
     String tabname2 = getString(R.string.tabexample_tab2); 
     String tabname3 = getString(R.string.tabexample_tab3); 
     String tabname4 = getString(R.string.tabexample_tab4); 

     tabHost = getTabHost(); 
     tabHost.addTab(tabHost.newTabSpec("tab1").setContent(R.id.layout_tab_one).setIndicator(tabname1)); 
     tabHost.addTab(tabHost.newTabSpec("tab2").setContent(R.id.layout_tab_two).setIndicator(tabname2)); 
     tabHost.addTab(tabHost.newTabSpec("tab3").setContent(R.id.layout_tab_three).setIndicator(tabname3)); 
     tabHost.addTab(tabHost.newTabSpec("tab4").setContent(R.id.layout_tab_four).setIndicator(tabname4)); 

     tabHost.setCurrentTab(0); 




     listview.setOnItemClickListener(new OnItemClickListener(){ 
      public void onItemClick(AdapterView<?> a, View v, int position, long id) { 
       flipper.showNext(); 


      }}); 




    } 



    public ArrayList<String> fetch() 
    { 
     ArrayList<String> listItems = new ArrayList<String>(); 

     try { 
      URL twitter = new URL(
        "JSON.php"); 
      URLConnection tc = twitter.openConnection(); 
      BufferedReader in = new BufferedReader(new InputStreamReader(
        tc.getInputStream())); 


      String line; 


      while ((line = in.readLine()) != null) { 




      //make sure youe String line is completely filled after that.. 
      if (!line.equals(null) && !line.equals("") && line.startsWith("[")) 
      { 
      JSONArray jArray = new JSONArray(line); 
      for (int i = 0; i < jArray.length(); i++) 
      { 
       JSONObject jobj = jArray.getJSONObject(i); 
      // also make sure you get the value from the jsonObject using some key 
      // like, jobj.getString("country"); 

      listItems.add(jobj.toString()); 
      } 
       } 

      } 

     } catch (MalformedURLException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } catch (JSONException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
     return listItems; 
    } 





    @Override 
    public void onClick(View arg0) { 
     // TODO Auto-generated method stub 

    } 


} 

错误日志猫:

08-25 21:38:15.742: ERROR/InputDispatcher(81): channel '40a14e38 com.app.android/com.app.android.Activity (server)' ~ Consumer closed input channel or an error occurred. events=0x8 

更新,这里有jArray的值由报道logcat的:

08-26 16:49:07.246:VERBOSE /应用(472):jarray值:[ “国家1”, “COUNTRY2”, “COUNTRY3”]

这些是正确的值!

好步进入死循环,注销输出以下:

08-26 16:59:55.756: WARN/System.err(506): org.json.JSONException: Value Country1 at 0 of type java.lang.String cannot be converted to JSONObject 
08-26 16:59:55.756: WARN/System.err(506):  at org.json.JSON.typeMismatch(JSON.java:96) 
08-26 16:59:55.766: WARN/System.err(506):  at org.json.JSONArray.getJSONObject(JSONArray.java:484) 
08-26 16:59:55.775: WARN/System.err(506):  at com.app.android.Activity.fetch(Activity.java:165) 
08-26 16:59:55.775: WARN/System.err(506):  at com.app.android.Activity.onCreate(eActivity.java:93) 
08-26 16:59:55.786: WARN/System.err(506):  at android.app.Activity.performCreate(Activity.java:4397) 
08-26 16:59:55.786: WARN/System.err(506):  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1048) 
08-26 16:59:55.795: WARN/System.err(506):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1779) 
08-26 16:59:55.806: WARN/System.err(506):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1831) 
08-26 16:59:55.806: WARN/System.err(506):  at android.app.ActivityThread.access$500(ActivityThread.java:122) 
08-26 16:59:55.815: WARN/System.err(506):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1024) 
08-26 16:59:55.815: WARN/System.err(506):  at android.os.Handler.dispatchMessage(Handler.java:99) 
08-26 16:59:55.826: WARN/System.err(506):  at android.os.Looper.loop(Looper.java:132) 
08-26 16:59:55.826: WARN/System.err(506):  at android.app.ActivityThread.main(ActivityThread.java:4123) 
08-26 16:59:55.836: WARN/System.err(506):  at java.lang.reflect.Method.invokeNative(Native Method) 
08-26 16:59:55.836: WARN/System.err(506):  at java.lang.reflect.Method.invoke(Method.java:491) 
08-26 16:59:55.846: WARN/System.err(506):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:841) 
08-26 16:59:55.855: WARN/System.err(506):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:599) 
08-26 16:59:55.855: WARN/System.err(506):  at dalvik.system.NativeStart.main(Native Method) 

回答

0

我认为你的问题可能是您的网址只是“JSON.php”。你不指定这个驻留的服务器(http://somewebsite.com/JSON.php)。当您设置调试点并逐步完成时会发生什么? Twitter网址创建后的价值是多少?我的猜测是它无法达到这个“JSON.php”。

编辑:试试这个:

而不是使用

JSONObject jobj = jArray.getJSONObject(i); 

的尝试

String country = jArray.getString(i); 
listItems.add(country); 
+0

JSON.php只是URL的一个例子,我实际使用本地PHP服务器的JSON饲料,但我已经测试了我的网页浏览器的网址,它工作正常,会与布局有关吗? – EI756

+0

在循环的中间设置一个调试点,它读取json以查看值。你有任何数据回来吗? – Jack

+0

是的,我只是想知道我将如何去检查数据是否会回来,有没有办法打印出值? – EI756