2015-05-01 3 views
0

Я хочу получить значения с карты Hash. Когда я попытался отобразить размер Hashmap в TextView, размер изменяется на моем экране. Любые идеи почему? Есть ли какой-либо другой способ вместо использования Hashmap для хранения JSONArray, поэтому его легче получить?Размер Hashmap не является постоянным

public void updateJSONdata() { 
    cafebartablesList = new ArrayList<HashMap<String, Integer>>(); 
    JSONParser jParser = new JSONParser(); 
    JSONObject json = jParser.getJSONFromUrl(READ_COMMENTS_URL); 

    try { 
    cafebartables = json.getJSONArray(TAG_POSTS); 
    for (int i = 0; i < cafebartables.length(); i++) { 
     LoadMap ld = new LoadMap(); 
     ld.execute(); 
     JSONObject c =cafebartables.getJSONObject(i); 

     int tableId = c.getInt(TAG_TABLE_ID); 
     int tableMarginLeft = c.getInt(TAG_MARGIN_LEFT); 
     int tableMarginTop = c.getInt(TAG_MARGIN_TOP); 
     int isFree = c.getInt(TAG_ISFREE); 

     map = new HashMap<String, Integer>(); 
     map.put(TAG_TABLE_ID, tableId); 
     map.put(TAG_MARGIN_LEFT, tableMarginLeft); 
     map.put(TAG_MARGIN_TOP, tableMarginTop); 
     map.put(TAG_ISFREE, isFree); 

     cafebartablesList.add(map); 
    } 
    } catch (JSONException e) { 
    e.printStackTrace(); 
    } 
} 

public void printMap() { 
    mapcounter ++; 
    length_txt =(TextView)findViewById(R.id.length_txt); 
    length_txt.setText("the size is " +cafebartablesList.size()); 
} 

public class LoadMap extends AsyncTask<Void, Void, Boolean> { 
    @Override 
    protected Boolean doInBackground(Void... arg0) { 
     updateJSONdata(); 
     return null; 
    } 

    @Override 
    protected void onPostExecute(Boolean result) { 
     super.onPostExecute(result); 
     printMap(); 
    } 
} 
+0

Вы отображая размер списка, который, сколько хеш-карты у вас есть, не сколько элементов находится в хэш-карте. –

+0

Проблемы с пониманием вашего кода. Вы рекурсивно называете свой код updateJSONdata внутри асинтезы? Вы пробовали использовать gson вместо typeadapter? –

+0

В каком порядке я могу отображать количество элементов, которые содержит хэш-карту и извлекать ее по одному? – Vasilis13

ответ

0

Вы используете метод asynctask, который рекурсивно вызывает себя, что, вероятно, вызывает какое-то странное поведение.

Попробуйте что-нибудь подобное. попросите свой метод печати вызвать вашу асинтезу. Ваша asynctask вызывает updateJSONdata, которая выполняет итерацию над объектом json и создает вашу карту. В конце вашей асинтезы обновите текстовое окно размером вашей карты.

public void updateJSONdata() { 

    cafebartablesList = new ArrayList<HashMap<String, Integer>>(); 

    JSONParser jParser = new JSONParser(); 

    JSONObject json = jParser.getJSONFromUrl(READ_COMMENTS_URL); 

    try { 

     cafebartables = json.getJSONArray(TAG_POSTS); 


     for (int i = 0; i < cafebartables.length(); i++) { 

      JSONObject c =cafebartables.getJSONObject(i); 

      int tableId = c.getInt(TAG_TABLE_ID); 
      int tableMarginLeft = c.getInt(TAG_MARGIN_LEFT); 
      int tableMarginTop = c.getInt(TAG_MARGIN_TOP); 
      int isFree = c.getInt(TAG_ISFREE); 

      map = new HashMap<String, Integer>(); 

      map.put(TAG_TABLE_ID, tableId); 
      map.put(TAG_MARGIN_LEFT, tableMarginLeft); 
      map.put(TAG_MARGIN_TOP, tableMarginTop); 
      map.put(TAG_ISFREE, isFree); 

      cafebartablesList.add(map); 


     } 

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

public void printMap() { 
    LoadMap ld = new LoadMap(); 

    ld.execute(); 

} 

    public class LoadMap extends AsyncTask<Void, Void, Boolean> { 

    @Override 
    protected Boolean doInBackground(Void... arg0) { 
     updateJSONdata(); 
     return null; 
    } 

    @Override 
    protected void onPostExecute(Boolean result) { 
     super.onPostExecute(result); 
     length_txt =(TextView)findViewById(R.id.length_txt); 
     length_txt.setText("the size is " +cafebartablesList.size()); 
    } 
} 
} 

В противном случае, вы могли бы использовать что-то вроде Gson, создать POJO для cafebartablesList и вызвать

Gson gson = new GsonBuilder() 
       .registerTypeAdapter(MyPojo.class, new MyDeserializer()) 
       .build(); 

MyPojo mp = gson.fromJson(json, MyPojo.class); 
+0

Спасибо, что это работает! Могу я спросить вас что-то еще? Я хочу получить некоторые значения из базы данных, которые представляют маржу слева и верхнюю границу. Я хотел использовать эти значения для создания некоторых кнопок. Метод printmap() предназначен для этого процесса. Но когда я пытаюсь вызвать его из приложения onPostExecute, произойдет сбой. – Vasilis13

+0

Можете ли вы опубликовать трассировку стека ошибки, которую вы получаете во время сбоя –

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