2013-11-27 6 views
0

Это приложение для Android, которое получает данные от двух разных URL-адресов JSON. Затем я хочу смешать их данные и поместить их на карту. Для этого я использую цикл вложенных циклов. Но проблема в том, что он показывает только YEARS и SYSTEMDATA2, а не SYSTEMDATA1. Я думаю, что мой вложенный цикл неверен.Почему это не для работы цикла?

Кто-нибудь знает причину?

for(int i = 0; i < array2System1.length(); i++){ 
     c1 = array2System1.getJSONObject(i); 

     for(int x = 0; x < array2System2.length(); x++){ 

      c2 = array2System2.getJSONObject(x); 

      } 

     //Storing JSON item in a Variable 
     valueSystem2 = c2.getString(SYSTEMDATA2); 
     year = c1.getString(YEAR); 
     valueSystem1 = c1.getString(SYSTEMDATA1); 

     // Adding value HashMap key => value 
     HashMap<String, String> map = new HashMap<String, String>(); 
     map.put(SYSTEMDATA1, valueSystem1); 
     map.put(SYSTEMDATA2, valueSystem2); 
     map.put(YEAR, year); 


     mylist.add(map); 
     list=(ListView)findViewById(R.id.list); 

     ListAdapter adapter = new SimpleAdapter(Search.this, mylist, 
        R.layout.list_M, 
        new String[] {SYSTEMDATA1, SYSTEMDATA2, YEAR}, new int[] { 
          R.id.systemData1, R.id.systemData2, R.id.years}); 

     mylist.setAdapter(adapter); 
    } 

результат должен быть как значение года (SYSTEMDATA2) значение (SYSTEMDATA1)

Текущая проблема не показывает одно из значений. (SYSTEMDATA1 или SYSTEMDATA2) http://i40.tinypic.com/2wqykvr.png

NEW UPDATE

 //Getting JSON Array 
     JSONObject myJson1 = jsons[0]; 
     JSONObject myJson2 = jsons[1]; 
     try { 
      List<Map<String, String>> listValues = new ArrayList<Map<String, String>>(); 



      JSONArray array1C1 = myJson1.getJSONArray("myDATA"); 
      JSONArray array2C1 = array1C1.getJSONArray(1); 

      JSONArray array1C2 = myJson2.getJSONArray("myDATA"); 
      JSONArray array2C2 = array1C2.getJSONArray(1); 

      for (int i=0; i<array2C1.length(); i++) 
      { 
       JSONObject entryJsonC1 = array2C1.getJSONObject(i); 


       String val1 = entryJsonC1.getString(SYSTEMDATA1); 

       String year = entryJsonC1.getString("date"); 


        JSONObject entryJsonC2 = array2C2.getJSONObject(i); 

        String val2 = entryJsonC2.getString(SYSTEMDATA2); 


       Map<String, String> map = new HashMap<String, String>(); 
       map.put(SYSTEMDATA1, val1); 
       map.put(SYSTEMDATA2, val2); 
       map.put(YEAR, year); 


       listValues.add(map); 

      } 

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


      String[] adaptersKeys = new String[] {SYSTEMDATA1, SYSTEMDATA2, YEAR}; 
      int[] adapterViews = new int[] {R.id.systemData1, R.id.systemData2, R.id.years}; 
      ListAdapter adapter = new SimpleAdapter(MultiMainActivity.this, listValues, R.layout.list2, adaptersKeys, adapterViews); 

      list.setAdapter(adapter); 

     } catch (JSONException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } catch (Exception e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 

Теперь результат похож: YEAR ТОТ VALUE ТОТ VALUE

+1

Ваш второй цикл цикла заканчивается символом '}' в строке8, тогда как он должен заканчиваться намного позже. – Manitoba

+0

Проверьте мой ответ, у вас может быть еще одна ошибка в методе 'setAdapter'. Я также немного оптимизировал ваш код, но он по-прежнему идеален. – Manitoba

+0

Можете ли вы разместить содержимое (по крайней мере частичного): array2System1, array2System2 и объяснить, как именно вы хотите их смешать на карте, пожалуйста, так что пример содержимого карты после микширования. – Melquiades

ответ

1
for(int i=0; i<array2System1.length(); i++) 
{ 
    c1 = array2System1.getJSONObject(i); 
    year = c1.getString(YEAR); 
    valueSystem1 = c1.getString(SYSTEMDATA1); 

    for(int x=0; x<array2System2.length(); x++) 
    { 
     c2 = array2System2.getJSONObject(x); 

     //Storing JSON item in a Variable 
     valueSystem2 = c2.getString(SYSTEMDATA2); 

     // Adding value HashMap key => value 
     HashMap<String, String> map = new HashMap<String, String>(); 
     map.put(SYSTEMDATA1, valueSystem1); 
     map.put(SYSTEMDATA2, valueSystem2); 
     map.put(YEAR, year); 

     mylist.add(map); 
    } 
} 

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

ListAdapter adapter = new SimpleAdapter(Search.this, mylist, R.layout.list_M, new String[] {SYSTEMDATA1, SYSTEMDATA2, YEAR}, new int[] {R.id.systemData1, R.id.systemData2, R.id.years}); 

// Shoudl be list and not mylist 
list.setAdapter(adapter); 
+0

Или что-то закрытое для этого. – Manitoba

+0

спасибо, но не работает. проверьте картинку, пожалуйста [link] (http://tinypic.com/view.php?pic=14y1pgo&s=5#.UpXj7JGDrwI) – Alex

+0

Не могли бы вы разместить свой JSON здесь? – Manitoba

1

Вы должны поместить весь код в внутренний цикл. В настоящее время вы просто закрываете внутренний цикл - он запускается и перезаписывает c2 и ничего не делает.

Что-то вроде:

for(int i = 0; i < array2System1.length(); i++){ 
    c1 = array2System1.getJSONObject(i); 

    for(int x = 0; x < array2System2.length(); x++){ 
     c2 = array2System2.getJSONObject(x); 

     //Storing JSON item in a Variable 
     valueSystem2 = c2.getString(SYSTEMDATA2); 
     year = c1.getString(YEAR); 
     valueSystem1 = c1.getString(SYSTEMDATA1); 

     // Adding value HashMap key => value 
     HashMap<String, String> map = new HashMap<String, String>(); 
     map.put(SYSTEMDATA1, valueSystem1); 
     map.put(SYSTEMDATA2, valueSystem2); 
     map.put(YEAR, year); 

     mylist.add(map); 
    } 
} 
+0

не работал. пожалуйста, посмотрите мой обновленный пост. – Alex

1

Второй цикл закрывается очень рано. это должно быть следующим.

for(int x = 0; x < array2System2.length(); x++){ 

      c2 = array2System2.getJSONObject(x); 

     //Storing JSON item in a Variable 
     valueSystem2 = c2.getString(SYSTEMDATA2); 
     year = c1.getString(YEAR); 
     valueSystem1 = c1.getString(SYSTEMDATA1); 

     // Adding value HashMap key => value 
     HashMap<String, String> map = new HashMap<String, String>(); 
     map.put(SYSTEMDATA1, valueSystem1); 
     map.put(SYSTEMDATA2, valueSystem2); 
     map.put(YEAR, year); 
     mylist.add(map); 
} // This is where it should get closed 

В противном случае вы просто переназначаете переменную c2 и теряете другие значения, вызывая последнее значение. Теперь вы сможете поместить значения valueSystem1, valueSystem2 и YEAR на карту, а затем добавить в список. Надеюсь, это поможет

+0

Спасибо, но я только что проверил. Он по-прежнему не показывает SYSTEMDATA1, а также каждый год повторяется с каждым значением. Пожалуйста, проверьте рис: [link] (http://i43.tinypic.com/14y1pgo.png) – Alex

+0

Можете ли вы опубликовать полный код? – Keerthivasan

+0

хорошо приложение довольно большое, но в настоящее время я следую [этому учебнику] (http://www.learn2crack.com/2013/11/listview-from-json-example.html). но с двумя URL-адресами. если вы думаете, что что-то не так, я бы опубликовал свою собственную основную деятельность. – Alex

0
List<Map<String, String>> listValues = new ArrayList<Map<String, String>>(); 

JSONArray jsonArray = new JSONArray(.....); // Contains all the indicators 
for (int i=0; i<jsonArray.length(); i++) 
{ 
    JSONObject entryJson = jsonArray.getJsonObject(i); 

    // Check integrity 
    if (!entryJson.hasKey("country")) throw new Exception("No 'country' key found"); 
    if (!entryJson.hasKey("value")) throw new Exception("No 'value' key found"); 
    if (!entryJson.hasKey("date")) throw new Exception("No 'date' key found"); 

    // Get country 
    JSONObject countryJson = entryJson.getJsonObject("country"); 
    if (!countryJson.hasKey("value")) throw new Exception("No 'value' key found"); 
    String country = countryJson.getString("value"); 

    // Get population 
    String population = entryJson.getString("value"); 

    // Get year 
    String year = entryJson.getString("date"); 

    // Create a new Map 
    Map<String, String> map = new HashMap<String, String>(); 
    map.put(SYSTEMDATA1, country); 
    map.put(SYSTEMDATA2, population); 
    map.put(YEAR, year); 

    // Add to list 
    listValues.add(map); 
} 

// Get the ListView 
ListView Llist = (ListView) findViewById(R.id.list); 

// Create a new adapter to attach this listView 
String[] adapterKeys = new String[] {SYSTEMDATA1, SYSTEMDATA2, YEAR}; 
int[] adapterViews = new int[] {R.id.systemData1, R.id.systemData2, R.id.years}; 
ListAdapter adapter = new SimpleAdapter(Search.this, listValues, R.layout.list_M, adapterKeys, adapterViews); 

// Attach the adapter to the listView 
Llist.setAdapter(adapter); 

Вот еще один способ, который должен работать лучше. Я не тестировал код, как это было сделано в блокноте. Скажите, пожалуйста, если у вас есть какие-либо проблемы.

+0

Благодарим за помощь. Существует несколько проблем, но похоже, что это близко к работе. Прежде всего, должен ли я иметь этот код внутри 'try {'? правильно? и, во-вторых, он не принимает 'hasKey' и хочет, чтобы я произнес его или изменил его на' has'. Я изменил его на has, так что ошибок нет и выполнил, но страница была пуста. – Alex

+0

и, кстати, что вы подразумеваете под 'SONArray jsonArray = new JSONArray (.....);'?! вы можете привести пример, основанный на моем случае. Я предполагаю, что эта часть является причиной того, что я получаю пустую страницу. – Alex

+0

Хорошо, я мог заставить его работать. просто нужно добавить 'list.setAdapter (адаптер);' в конце. Но я поддержал ту же проблему, и я начал. он показывает ту же ценность для обеих стран. такое же количество. :/ – Alex

0

Потому что вы определили это:

private static final String SYSTEMDATA1 = "value"; 
private static final String SYSTEMDATA2 = "value"; 

//you can't have 2 entries with the same key 
private static final String SYSTEMDATA2_KEY = "value2"; 

Проблема возникает, когда вы создаете карту:

// Adding value HashMap key => value 
HashMap<String, String> map = new HashMap<String, String>(); 
map.put(SYSTEMDATA1, valueSystem1); 
map.put(SYSTEMDATA2_KEY, valueSystem2); 
map.put(YEAR, year); 

A Map является:

Объект, который отображает ключи к значениям , Карта не может содержать дубликаты ключей; каждая клавиша может отображать не более чем одно значение

Из документов для положить() метод:

Связывает указанное значение с указанным ключом в этой карте (дополнительная работа). Если на карте ранее содержалось сопоставление для ключа, старое значение заменяется указанным значением.

Так вы размещаете valueSystem1 используя SYSTEMDATA1 в качестве ключа, который является «значение», а затем вы устанавливаете valueSystem2 используя SYSTEMDATA2 в качестве ключа, который также является «значение», так что вы перезапись valueSystem1!

Смотрите ниже редактировать ...

EDIT:

Я предполагаю, что, чтобы получить ваши ценности, вы должны использовать ключи, которые «значение», это нормально, но для вставки в на карте позже вы должны иметь уникальные ключи. Если у вас есть SYSTEMDATA1 = «значение» и SYSTEMDATA2 = «значение», добавить еще один, который вы будете использовать для хранения на карте, а затем в адаптере:

//you can't have 2 entries with the same key 
private static final String SYSTEMDATA2_KEY = "value2"; 

// Create a new Map 
Map<String, String> map = new HashMap<String, String>(); 
map.put(SYSTEMDATA1, val1); 
map.put(SYSTEMDATA2_KEY, val2); 
map.put(YEAR, year); 

, а затем, когда вы установите адаптер ключи:

// Create a new adapter to attach this listView 
String[] adapterKeys = new String[] {SYSTEMDATA1, SYSTEMDATA2_KEY, YEAR}; 

Код обновлен в моем первоначальном ответе.

+0

Я вижу. Спасибо за ваше объяснение. Теперь я переделаю его по карте. но все же он показывает одинаковые данные для обоих значений. Наверное, на карте он не должен переписываться, а? Мне помогли @Manitoba и его последний ответ. Так что было бы здорово, если вы проверите это и увидите, почему он сохраняет значения перезаписи. – Alex

+0

Обновите код в своем сообщении до его текущего состояния, я посмотрю. – Melquiades

+0

Пожалуйста, проверьте ** NEW UPDATE ** бит. Я тоже сохранил старый файл, так что вы тоже это видите. Спасибо – Alex

Смежные вопросы