5

JSONからListViewにデータを取得しようとしていますが、空白のページが表示されるたびに、カテゴリのリストもエラーも取得されません。

私は Android が初めてで、JSON を使用して Multi Level ListView を作成しようとしています。

私の場合、JSONのみを使用してこれを実現したい:カテゴリ > アイテム > 詳細

しかし、最初の画面で問題に直面しており、カテゴリを取得することさえできません

JSON :

{
    "categoryId": "1",
    "categoryTitle": { "SmartPhones": [
            {
                "itemId": "1",
                "itemTitle": "Galaxy Mega 5.8"
            },
            {
                "itemId": "2",
                "itemTitle": "Galaxy Mega 6.3"
            }
        ]
    },
    "categoryId": "2",
    "categoryTitle": { "Tablets": [
        {
            "itemId": "1",
            "itemTitle": "Galaxy Note 510"
        },
        {
            "itemId": "2",
            "itemTitle": "Galaxy Note 800"
        }
    ]}
}

正しいJSON形式を教えてくれた@Segiに感謝します

活動コード:

    public class CategoriesActivity extends ListActivity {
// Connection detector
ConnectionDetector cd;

// Alert dialog manager
AlertDialogManager alert = new AlertDialogManager();

// Progress Dialog
private ProgressDialog pDialog;

// Creating JSON Parser object
JSONParser jsonParser = new JSONParser();

ArrayList<HashMap<String, String>> categoriesList;

// albums JSONArray
JSONArray categories = null;

// albums JSON url
private static final String URL_CATEGORIES = "my.json"; // providing proper URL

// ALL JSON node names
private static final String TAG_ID = "categoryId";
private static final String TAG_TITLE = "categoryTitle";


@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_albums);

    cd = new ConnectionDetector(getApplicationContext());

    // Check for internet connection
    if (!cd.isConnectingToInternet()) {
        // Internet Connection is not present
        alert.showAlertDialog(CategoriesActivity.this, "Internet Connection Error",
                "Please connect to working Internet connection", false);
        // stop executing code by return
        return;
    }

    // Hashmap for ListView
    categoriesList = new ArrayList<HashMap<String, String>>();

    // Loading Categories JSON in Background Thread
    new LoadCategories().execute();

    // get listview
    ListView lv = getListView();

    /**
     * Listview item click listener
     * ProductListActivity will be lauched by passing category id
     * */
    lv.setOnItemClickListener(new android.widget.AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> arg0, View view, int arg2,
                long arg3) {
            // on selecting a single category
            // ProductListActivity will be launched to show products inside the category
            Intent i = new Intent(getApplicationContext(), TrackListActivity.class);

            // send category id to productlist activity to get list of products under that category
            String category_id = ((TextView) view.findViewById(R.id.album_id)).getText().toString();
            i.putExtra("category_id", category_id);             

            startActivity(i);
        }
    });     
}

/**
 * Background Async Task to Load all Categories by making http request
 * */
class LoadCategories extends AsyncTask<String, String, String> {

    /**
     * Before starting background thread Show Progress Dialog
     * */
    @Override
    protected void onPreExecute() {
        super.onPreExecute();
        pDialog = new ProgressDialog(CategoriesActivity.this);
        pDialog.setMessage("Listing Categories ...");
        pDialog.setIndeterminate(false);
        pDialog.setCancelable(false);
        pDialog.show();
    }

    /**
     * getting Categories JSON
     * */
    protected String doInBackground(String... args) {
        // Building Parameters
        List<NameValuePair> params = new ArrayList<NameValuePair>();

        // getting JSON string from URL
        String json = jsonParser.makeHttpRequest(URL_CATEGORIES, "GET",
                params);

        // Check your log cat for JSON reponse
        Log.d("Categories JSON: ", "> " + json);

        try {               
            categories = new JSONArray(json);

            if (categories != null) {
                // looping through all categories
                for (int i = 0; i < categories.length(); i++) {
                    JSONObject c = categories.getJSONObject(i);

                    // Storing each json item values in variable
                    String id = c.getString(TAG_ID);
                    String title = c.getString(TAG_TITLE);


                    // creating new HashMap
                    HashMap<String, String> map = new HashMap<String, String>();

                    // adding each child node to HashMap key => value
                    map.put(TAG_ID, id);
                    map.put(TAG_TITLE, title);


                    // adding HashList to ArrayList
                    categoriesList.add(map);
                }
            }else{
                Log.d("Categories: ", "null");
            }

        } catch (JSONException e) {
            e.printStackTrace();
        }

        return null;
    }

    /**
     * After completing background task Dismiss the progress dialog
     * **/
    protected void onPostExecute(String file_url) {
        // dismiss the dialog after getting all categories
        pDialog.dismiss();
        // updating UI from Background Thread
        runOnUiThread(new Runnable() {
            public void run() {
                /**
                 * Updating parsed JSON data into ListView
                 * */
                ListAdapter adapter = new SimpleAdapter(
                        CategoriesActivity.this, categoriesList,
                        R.layout.list_item_albums, new String[] { TAG_ID,
                                TAG_TITLE }, new int[] {
                                R.id.category_id, R.id.category_title });

                // updating listview
                setListAdapter(adapter);
      }
     });
   }
  }
}

ログキャット:

06-15 12:21:27.124: D/dalvikvm(786): GC_FOR_ALLOC freed 68K, 8% free 2488K/2680K, paused 173ms, total 213ms
06-15 12:21:27.174: I/dalvikvm-heap(786): Grow heap (frag case) to 3.152MB for 635812-byte allocation
06-15 12:21:27.264: D/dalvikvm(786): GC_FOR_ALLOC freed 1K, 6% free 3108K/3304K, paused 89ms, total 89ms
06-15 12:21:27.354: D/dalvikvm(786): GC_CONCURRENT freed <1K, 6% free 3111K/3304K, paused 5ms+3ms, total 95ms
06-15 12:21:28.274: I/Choreographer(786): Skipped 41 frames!  The application may be doing too much work on its main thread.
06-15 12:21:28.874: I/Choreographer(786): Skipped 123 frames!  The application may be doing too much work on its main thread.
06-15 12:21:29.044: D/gralloc_goldfish(786): Emulator without GPU emulation detected.
06-15 12:21:29.134: D/dalvikvm(786): GC_CONCURRENT freed 19K, 4% free 3478K/3620K, paused 8ms+38ms, total 268ms
06-15 12:21:30.894: I/Choreographer(786): Skipped 51 frames!  The application may be doing too much work on its main thread.
06-15 12:20:36.624: D/Categories JSON:(786): > {
06-15 12:20:36.624: D/Categories JSON:(786):     "categoryId": "1",
06-15 12:20:36.624: D/Categories JSON:(786):     "categoryTitle": {
06-15 12:20:36.624: D/Categories JSON:(786):         "SmartPhones": [
06-15 12:20:36.624: D/Categories JSON:(786):             {
06-15 12:20:36.624: D/Categories JSON:(786):                 "itemId": "1",
06-15 12:20:36.624: D/Categories JSON:(786):                 "itemTitle": "Galaxy Mega 5.8"
06-15 12:20:36.624: D/Categories JSON:(786):             },
06-15 12:20:36.624: D/Categories JSON:(786):             {
06-15 12:20:36.624: D/Categories JSON:(786):                 "itemId": "2",
06-15 12:20:36.624: D/Categories JSON:(786):                 "itemTitle": "Galaxy Mega 6.3"
06-15 12:20:36.624: D/Categories JSON:(786):             }
06-15 12:20:36.624: D/Categories JSON:(786):         ]
06-15 12:20:36.624: D/Categories JSON:(786):     },
06-15 12:20:36.624: D/Categories JSON:(786):     "categoryId": "2",
06-15 12:20:36.624: D/Categories JSON:(786):     "categoryTitle": {"Tablets": [
06-15 12:20:36.624: D/Categories JSON:(786):         {
06-15 12:20:36.624: D/Categories JSON:(786):             "itemId": "1",
06-15 12:20:36.624: D/Categories JSON:(786):             "itemTitle": "Galaxy Note 510"
06-15 12:20:36.624: D/Categories JSON:(786):         },
06-15 12:20:36.624: D/Categories JSON:(786):         {
06-15 12:20:36.624: D/Categories JSON:(786):             "itemId": "2",
06-15 12:20:36.624: D/Categories JSON:(786):             "itemTitle": "Galaxy Note 800"
06-15 12:20:36.624: D/Categories JSON:(786):         }
06-15 12:20:36.624: D/Categories JSON:(786):     ]}
06-15 12:20:36.624: D/Categories JSON:(786): }
06-15 12:20:36.814: W/System.err(786): org.json.JSONException: Value {"categoryTitle":{"SmartPhones":[{"itemId":"1","itemTitle":"Galaxy Mega 5.8"},{"itemId":"2","itemTitle":"Galaxy Mega 6.3"}]},"categoryId":"2"} of type org.json.JSONObject cannot be converted to JSONArray
06-15 12:20:36.824: W/System.err(786):  at org.json.JSON.typeMismatch(JSON.java:111)
06-15 12:20:36.836: W/System.err(786):  at org.json.JSONArray.<init>(JSONArray.java:91)
06-15 12:20:36.836: W/System.err(786):  at org.json.JSONArray.<init>(JSONArray.java:103)
06-15 12:20:36.904: W/System.err(786):  at com.my.json.CategoriesActivity$LoadCategories.doInBackground(CategoriesActivity.java:135)
06-15 12:20:36.904: W/System.err(786):  at com.my.json.CategoriesActivity$LoadCategories.doInBackground(CategoriesActivity.java:1)
06-15 12:20:36.914: W/System.err(786):  at android.os.AsyncTask$2.call(AsyncTask.java:287)
06-15 12:20:36.914: W/System.err(786):  at java.util.concurrent.FutureTask.run(FutureTask.java:234)
06-15 12:20:36.925: W/System.err(786):  at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1080)
06-15 12:20:36.925: W/System.err(786):  at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:573)
06-15 12:20:36.934: W/System.err(786):  at java.lang.Thread.run(Thread.java:856)
06-15 12:20:45.984: D/InputEventConsistencyVerifier(786): KeyEvent: ACTION_UP but key was not down.
06-15 12:20:45.984: D/InputEventConsistencyVerifier(786):   in android.view.ViewRootImpl@40de89c8
06-15 12:20:45.984: D/InputEventConsistencyVerifier(786):   0: sent at 106936000000, KeyEvent { action=ACTION_UP, keyCode=KEYCODE_MENU, scanCode=229, metaState=0, flags=0x8, repeatCount=0, eventTime=106936, downTime=106820, deviceId=0, source=0x101 }

注: 空白のアクティビティを取得し、ListView にデータを取得せず、エラーを取得しません

4

6 に答える 6

1

はい、Logcat から、JSON に問題があることは明らかです。

次の JSON を試してみてください。->

[{ "categoryId": "1", { "categoryTitle": "タブレット" , "タブレット" : [ { "itemId": "1", "itemTitle": "Galaxy Mega 5.8" }, { "itemId": " 2", "itemTitle": "Galaxy Mega 6.3" } ] }, {"categoryId": "2", "categoryTitle": { "タブレット": [ { "itemId": "1", "itemTitle": "Galaxy Note 510" }, { "itemId": "2", "itemTitle": "Galaxy Note 800" } ]} }]

特別なことは何もしませんでしたが、括弧を追加して JSON 形式にしました。これを php から取得している場合は、そこで必要な変更を加えてフォーマットします。

注意: ここで、JSON は複雑な構造を持っているため、解析には注意してください。

于 2013-06-15T12:51:57.163 に答える
0

Jsonの下で試してください:

{
    "categoryId": "1",
    "categoryTitle": {
        "Appetizers": [
            {
                "itemId": "1",
                "itemTitle": "Samosa"
            },
            {
                "itemId": "2",
                "itemTitle": "Vegetable Pakora"
            }
        ]
    },
    "categoryId": "2",
    "categoryTitle": {"Mixed Platter": [
        {
            "itemId": "1",
            "itemTitle": "Veggie"
        },
        {
            "itemId": "2",
            "itemTitle": "Non Veggie"
        }
    ]}
}
于 2013-06-15T10:24:24.183 に答える
0
"categoryTitle" : "Appetizers" : [

"categoryTitle" : "Mixed Platter" : [

それは正しくありません。あなたは何をしようとしているのですか?

于 2013-06-15T10:18:03.277 に答える
0

ループを終了した直後にアダプターをリストビューに設定してみてください(JSONループ)

于 2013-06-15T11:32:21.907 に答える