开发者

Android Listview not being populated with JSON Strings

开发者 https://www.devze.com 2023-03-31 08:34 出处:网络
I have an app that has a viewflipper to keep tabs in view at all times throughout the app, and a listview below the tabs. I\'m trying to populate the list view with JSON strings from a web server, the

I have an app that has a viewflipper to keep tabs in view at all times throughout the app, and a listview below the tabs. I'm trying to populate the list view with JSON strings from a web server, the web server is feeding JSON strings in the following format: ["X","Y","Z"] So basically, I want to have the list view in list each string on a different row.

The app is launching ok, the list view just appears to be empty. This is the tutorial I used: http://inchoo.net/mobile-development/android-development/simple-android-json-parsing-example-with-output-into-listactivity/ Here is the full code the main launching activity:

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");
            URLConnectio开发者_C百科n 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

    }


}

Error in Log Cat:

 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

Update, here are the values of jArray as reported by Logcat:

08-26 16:49:07.246: VERBOSE/app(472): jarray value: ["Country1","Country2","Country3"]

These are the correct values!

Ok stepping into the loop, log out outputs the following:

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)


I think your problem could be that your URL is just "JSON.php". You dont specify the server this resides on (http://somewebsite.com/JSON.php). What happens when you set debug points and step through? Whats the value of the twitter URL after its created? My guess is that it cannot reach this "JSON.php".

EDIT: Try this:

Instead of using

JSONObject jobj = jArray.getJSONObject(i);

Try

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

精彩评论

暂无评论...
验证码 换一张
取 消