2015-10-05 42 views
-1

我想解析來自在線源的JSON數據。我使用了調試,並看到JSON數據正好返回到活動。但是,當我運行應用程序時,應該顯示此數據的活動,它顯示爲空白。我想如果我用這些數據誇大名單有什麼問題。JSON數組返回數據,但不能設置爲佈局

我使用的教程是:http://www.androidhive.info/2012/01/android-json-parsing-tutorial/

請幫我解決這個問題。

下面是活動代碼:

package com.plusworks.appdev.youcancook; 

import android.app.ProgressDialog; 
import android.content.Context; 
import android.content.Intent; 
import android.os.AsyncTask; 
import android.os.Bundle; 
import android.util.Log; 
import android.view.LayoutInflater; 
import android.view.Menu; 
import android.view.MenuItem; 
import android.view.View; 
import android.widget.FrameLayout; 
import android.widget.ListAdapter; 
import android.widget.ListView; 
import android.widget.SimpleAdapter; 
import android.widget.TextView; 

import org.json.JSONArray; 
import org.json.JSONException; 
import org.json.JSONObject; 

import java.util.ArrayList; 
import java.util.HashMap; 

public class CuisineDishes extends BaseActivity { 
    private ProgressDialog pDialog; 
    ListView dishList; 
    ArrayList<HashMap<String,String>> cuisineDishList; 
    private static String url = "http://youcancook.site90.com/amdishes.json"; 
    JSONArray dishes=null; 

    private static final String ARRAY_DISHES="americandishes"; 
    private static final String ID="id"; 
    private static final String NAME="name"; 
    private static final String SHORTDESC="shortdesc"; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     FrameLayout fl = (FrameLayout) findViewById(R.id.main_content); 
     LayoutInflater inflater = (LayoutInflater) this.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     View contentView = inflater.inflate(R.layout.activity_cuisine_dishes, null, false); 
     fl.addView(contentView); 

     Intent mIntent = getIntent(); 
     String cuisineName = mIntent.getStringExtra("CuisineName"); 

     getSupportActionBar().setTitle(cuisineName + " Dishes"); 

     cuisineDishList=new ArrayList<>(); 
     dishList = (ListView) findViewById(R.id.dish_list); 
     new AsyncDishModel().execute(); 
    } 

    private class AsyncDishModel extends AsyncTask<Void,Void,Void>{ 
     @Override 
     protected void onPreExecute() { 
      super.onPreExecute(); 
      // Showing progress dialog 
      pDialog=new ProgressDialog(CuisineDishes.this); 
      pDialog.setMessage("Fetching dishes..."); 
      pDialog.setCancelable(false); 
      pDialog.show(); 
     } 

     @Override 
     protected Void doInBackground(Void... params) { 
      ServiceHandler sh=new ServiceHandler(); 
      String jsonStr=sh.makeServiceCall(url, ServiceHandler.GET); 
      if(jsonStr!=null){ 
       try{ 
        JSONObject jObject=new JSONObject(jsonStr); 
        dishes=jObject.getJSONArray(ARRAY_DISHES); 
        for(int i=0;i<dishes.length();i++){ 
         JSONObject c=dishes.getJSONObject(i); 
         String id=c.getString(ID); 
         String name=c.getString(NAME); 
         String shortdesc=c.getString(SHORTDESC); 

         HashMap<String,String> templist=new HashMap<String,String>(); 

         templist.put(ID,id); 
         templist.put(NAME,name); 
         templist.put(SHORTDESC,shortdesc); 
         cuisineDishList.add(templist); 
        } 
       } catch (JSONException e) { 
        e.printStackTrace(); 
       } 
      } 
      return null; 
     } 

     @Override 
     protected void onPostExecute(Void result) { 
      super.onPostExecute(result); 
      // Dismiss the progress dialog 
      if (pDialog.isShowing()) 
       pDialog.dismiss(); 
      /** 
      * Updating parsed JSON data into ListView 
      * */ 
      ListAdapter adapter = new SimpleAdapter(
        CuisineDishes.this, cuisineDishList, 
        R.layout.cuisine_dish_list_item, new String[] {ID,NAME, 
        SHORTDESC}, new int[]{ R.id.mId,R.id.title_dish, 
        R.id.desc_dish}); 
      dishList.setAdapter(adapter); 
     } 
    } 

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     // Inflate the menu; this adds items to the action bar if it is present. 
     getMenuInflater().inflate(R.menu.menu_cuisine_dishes, menu); 
     return true; 
    } 

    @Override 
    public boolean onOptionsItemSelected(MenuItem item) { 
     // Handle action bar item clicks here. The action bar will 
     // automatically handle clicks on the Home/Up button, so long 
     // as you specify a parent activity in AndroidManifest.xml. 
     int id = item.getItemId(); 

     //noinspection SimplifiableIfStatement 
     if (id == R.id.action_settings) { 
      return true; 
     } 

     return super.onOptionsItemSelected(item); 
    } 
} 

服務處理器是一樣的,在教程中給出。

這裏是我的活動佈局代碼:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:paddingBottom="@dimen/activity_vertical_margin" 
    android:paddingLeft="@dimen/activity_horizontal_margin" 
    android:paddingRight="@dimen/activity_horizontal_margin" 
    android:paddingTop="@dimen/activity_vertical_margin" 
    tools:context="com.plusworks.appdev.youcancook.CuisineDishes"> 

    <ListView 
     android:id="@+id/dish_list" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content"></ListView> 

</RelativeLayout> 

這裏是cuisine_dish_list_item.xml代碼

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:orientation="vertical" 
    android:padding="10dp" 
    android:paddingLeft="10dp" 
    android:paddingRight="10dp"> 

    <TextView 
     android:id="@+id/title_dish" 
     android:layout_height="wrap_content" 
     android:layout_width="match_parent" 
     android:text="Title" 
     android:textSize="30dp" /> 

    <TextView 
     android:id="@+id/desc_dish" 
     android:layout_height="wrap_content" 
     android:layout_width="match_parent" 
     android:text="Short Description" 
     android:textSize="20dp" /> 

    <TextView 
     android:id="@+id/mId" 
     android:layout_height="wrap_content" 
     android:layout_width="match_parent" 
     android:text="ID" 
     android:visibility="invisible" /> 

</LinearLayout> 

回答