2014-10-28 2 views
1

У меня есть слушатель, когда я нажимаю на даты, когда он будет искать арраиста и получать даты того, что я нажимаю тогда, когда я меняю месяц, я удалю даты, а затем добавлю даты в текущем месяце.java.lang.IndexOutOfBoundsException: Недопустимый индекс 2, размер 2 в Arraylist?

public void onSelectDate(Date date, View view) { 
    JSONObject jsonObj = new JSONObject(jsonStr); 
    JsonArray datesIn = jsonObj.getJSONArray(TAG_SCHEDULE); 
    for (int i = 0; i < datesIn.length(); i++) { 
     JSONObject c = datesIn.getJSONObject(i); 
     String dateD = c.getString(TAG_DATED); 
     String statusD = c.getString(TAG_STATUS); 
     HashMap<String, String> contact = new HashMap<String, String>(); 
     contact.put("Tag_dated", dateD); 
     contact.put("Tag_status", statusD); 
     contactList.add(contact); 
     Date s = formatter.parse(dateD); 

     ArrayList<HashMap<String, String>> contactList= new ArrayList<HashMap<String,String>>();; 
     if(formatter.format(date).equals(contactList.get(0).get(TAG_DATED))){ 
      if(contactList.get(0).get(TAG_STATUS).equals("Occupied")){ 
       Toast.makeText(getApplicationContext(),"S",Toast.LENGTH_SHORT).show(); 
      }else if(contactList.get(0).get(TAG_STATUS).equals("Reserved")) 
       Toast.makeText(getApplicationContext(),"R",Toast.LENGTH_SHORT).show(); 
     }else if(formatter.format(date).equals(contactList.get(1).get(TAG_DATED))){ 
      if(contactList.get(1).get(TAG_STATUS).equals("Occupied")){ 
       Toast.makeText(getApplicationContext(),"S",Toast.LENGTH_SHORT).show(); 
      }else if(contactList.get(1).get(TAG_STATUS).equals("Reserved")){ 
       Toast.makeText(getApplicationContext(),"R",Toast.LENGTH_SHORT).show(); 
      } 
     }else if(formatter.format(date).equals(contactList.get(2).get(TAG_DATED))){ 
      if(contactList.get(2).get(TAG_STATUS).equals("Occupied")){ 
       Toast.makeText(getApplicationContext(),"S",Toast.LENGTH_SHORT).show(); 
      }else if(contactList.get(2).get(TAG_STATUS).equals("Reserved")){ 
       Toast.makeText(getApplicationContext(),"R",Toast.LENGTH_SHORT).show(); 
      } 
     }else if(formatter.format(date).equals(contactList.get(3).get(TAG_DATED))){ 
      if(contactList.get(3).get(TAG_STATUS).equals("Occupied")){ 
       Toast.makeText(getApplicationContext(),"S",Toast.LENGTH_SHORT).show(); 
      }else if(contactList.get(3).get(TAG_STATUS).equals("Reserved")){ 
       Toast.makeText(getApplicationContext(),"R",Toast.LENGTH_SHORT).show(); 
      } 
     }else if(formatter.format(date).equals(contactList.get(4).get(TAG_DATED))){ 
      if(contactList.get(4).get(TAG_STATUS).equals("Occupied")){ 
       Toast.makeText(getApplicationContext(),"S",Toast.LENGTH_SHORT).show(); 
      }else if(contactList.get(4).get(TAG_STATUS).equals("Reserved")){ 
       Toast.makeText(getApplicationContext(),"R",Toast.LENGTH_SHORT).show(); 
      } 
     }else if(formatter.format(date).equals(contactList.get(5).get(TAG_DATED))){ 
      if(contactList.get(5).get(TAG_STATUS).equals("Occupied")){ 
       Toast.makeText(getApplicationContext(),"S",Toast.LENGTH_SHORT).show(); 
      }else if(contactList.get(5).get(TAG_STATUS).equals("Reserved")){ 
       Toast.makeText(getApplicationContext(),"R",Toast.LENGTH_SHORT).show(); 
      } 
     }else{ 
      Toast.makeText(getApplicationContext(),"NP",Toast.LENGTH_SHORT).show(); 
     } 
    } 

моя проблема в том, когда я меняю месяц, а затем на даты, когда у него есть ошибка. Ошибка

public void onChangeMonth(int month, int year) { 
    contactList.clear(); 
    HashMap<String, String> contact = new HashMap<String, String>(); 
    contact.put("Tag_dated", dateD); 
    contact.put("Tag_status", statusD); 
    contactList.add(contact); 
} 

Logcat:

http://i.stack.imgur.com/Is35y.png

+2

'' Недопустимый индекс 2, размер 2 "' означает размер '2', поэтому действительный индекс равен только' 0', а '1' – DnR

+1

. Размер вашего контактного списка равен 2, чтобы вы могли получить индекс 0 и 1. –

+1

FYI: Когда ArrayList имеет 2 элемента (размер 2). Первый элемент находится в индексе 0, а второй - в индексе 1. И нет ничего в индексе 2. – grattmandu03

ответ

0

Ошибка в прямом направлении, размер - два. Индекс начинается с 0, поэтому индексы доступны являются 0 и 1 не 1 и 2. Ваш цикл может потребоваться размер - 1.

Вместо жесткого кодирования ваши заявления, такие как: если (formatter.format (дата) .equals (contactList.get (0) .get (TAG_DATED))) {

Попробуйте сделать это в цикле, где вы идете

public void updateToast(Date date, ArrayList<HashMap<String, String>> contactList) { 
    String formattedDate = formatter.format(date); 
    for (int i = 0; i < contactList.size(); i++) 
    { 
     if (formattedDate.equals(contactList.get(i).get(TAG_DATED))) 
     { 
      if(contactList.get(i).get(TAG_STATUS).equals("Occupied")) 
      { 
       Toast.makeText(getApplicationContext(),"S",Toast.LENGTH_SHORT).show(); 
       return; 
      } else if(contactList.get(i).get(TAG_STATUS).equals("Reserved")) 
      { 
       Toast.makeText(getApplicationContext(),"R",Toast.LENGTH_SHORT).show(); 
       return; 
      } 
     } 
    } 
    // If here then its not found in any lists throw up your other text. 
    Toast.makeText(getApplicationContext(),"NP",Toast.LENGTH_SHORT).show(); 
} 

Часть этого может быть немного, как его сделали свободную руку здесь.

+0

Спасибо, что он работает сейчас. –

0

Вы создаете новый ArrayList называется contactList, и добавление одного элемента к нему; то вы пытаетесь извлечь из него несколько элементов!

0

В коде onSelectDate вы говорите:

contactList.add(contact); 

Это добавит HashMap в свой список только один раз, так что вы можете использовать contactList.get (0) на вашем Arraylist. Но в дальнейшем вы говорите:

contactList.get(1);//even two 

Таким образом, у него нет элемента за пределами первого и, следовательно, он исключает исключение.

0

позволяет реорганизовать код немного, позволяет избавиться от этого уродливого противным и небезопасным, если/другое ужас, и изменить его красивым и прекрасным петли

boolean found = false; 
    String formattedDate = formatter.format(date); 
    for (int i = 0; i < contactList.size(); i++) { 
     if (formattedDate.equals(contactList.get(i).get(TAG_DATED))) { 
      if (contactList.get(i).get(TAG_STATUS).equals("Occupied")) { 
       Toast.makeText(getApplicationContext(), "S", 
         Toast.LENGTH_SHORT).show(); 
      } else if (contactList.get(1).get(TAG_STATUS) 
        .equals("Reserved")) { 
       Toast.makeText(getApplicationContext(), "R", 
         Toast.LENGTH_SHORT).show(); 
      } 
      found = true; 
      break; 
     } 
    } 
    if (!found) { 
     Toast.makeText(getApplicationContext(), "NP", 
       Toast.LENGTH_SHORT).show(); 
    } 

этот код должен делать то же самое, как у вас, но он не должен давать вам ArrayIndexOutOfBoundsException исключение

+0

Думайте, что вам нужно переместить проверку if (! Found) за пределы цикла for, иначе она будет вызывать ее каждый раз, когда ее не найти на итерации цикла. (но я думаю, это зависит от того, что он хочет или нет) – VeenarM

+0

@VeenarM вы правы, я не считал скобки вправо, это было очень неряшливо, thx – user902383

+0

Спасибо, это работает. –

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