2012-03-27 2 views
1

У меня проблемы с логикой хранения ImageView в ArrayList.ImageView ArrayList дает NullPointerException

Приложение, которое я разрабатываю, отслеживает статусы игроков в игре. Пользователь сначала добавляет объекты Player (которые отслеживают строку состояния и образ состояния, чтобы идти с ним) в ArrayList (чтобы отслеживать их все). Затем, после отправки всех игроков, на экране появляется всплывающее окно TableRow для каждого игрока, содержащее кнопку (для просмотра профиля Игрока), ImageView (значок, представляющий статус), и TextView (содержащий строку состояния игрока стоимость).

У меня нет проблем с кнопками и загрузкой профиля каждого игрока. Проблема возникает при загрузке графического интерфейса «select status» из dialog_select_icon.xml, особенно в ImageView ArrayList. Я получаю исключение NullPointerException, которое не имеет смысла для меня, потому что я делаю это по существу так же, как и кнопки.

//this code runs when user clicks a player's status icon 
public void playerStatusIconClicked(View v) 
{ 
    //loop through buttons to determine which player's button was clicked 
    for (int i = 0; i < playerList.size(); i++) 
    { 
     if (v.getId() == playerStatusIVList.get(i).getId()) 
     { 
      calledPlayer = i; //instance variable 
      loadStatusIconGUI(); 
     }//if 
    }//for 
}//method playerStatusIconClicked 


//showStatusIconGUI inflates the "select status icon" GUI 
//and handles the user selecting an icon 
private void loadStatusIconGUI() 
{  
    //inflate the GUI for the showStatusIcon dialog (inflater is an instance variable) 
    View view = inflater.inflate(R.layout.dialog_select_icon, null); 
    //if the list has something in it, start from fresh 
    if (!selectStatusIVList.isEmpty()) 
    { 
     selectStatusIVList.clear();   
    } 

    //list of icons in the "select status icon" dialog 
    selectStatusIVList.add((ImageView) statusIconGUI.findViewById(R.id.statusIV0)); 
    selectStatusIVList.add((ImageView) statusIconGUI.findViewById(R.id.statusIV1)); 
    selectStatusIVList.add((ImageView) statusIconGUI.findViewById(R.id.statusIV2)); 
    selectStatusIVList.add((ImageView) statusIconGUI.findViewById(R.id.statusIV3)); 
    selectStatusIVList.add((ImageView) statusIconGUI.findViewById(R.id.statusIV4)); 
    selectStatusIVList.add((ImageView) statusIconGUI.findViewById(R.id.statusIV5)); 
    selectStatusIVList.add((ImageView) statusIconGUI.findViewById(R.id.statusIV6)); 

    //create a dialog so user can select an icon 
    AlertDialog.Builder selectIconDialog = new AlertDialog.Builder(this); 
    selectIconDialog.setView(view); //set the Dialog's custom view 
    selectIconDialog.setTitle(R.string.title_select_icon); 

    selectIconDialog.setNegativeButton(R.string.close, null); 
    selectIconDialog.show(); 
}//showStatusIconGUI 


//Handle clicks in the "select status icon" dialog 
//Assigns a new status to the player 
public void statusIconClicked(View v) 
{ 
    Toast message; 

    for (int i = 0; i < selectStatusIVList.size(); i++) 
    { 
     if (v.getId() == selectStatusIVList.get(i).getId()) 
     { 
      message = Toast.makeText(
       MafiaTracker.this, "new status: " statusID[i], Toast.LENGTH_SHORT); 
      message.show(); 
      playerList.get(calledPlayer).setImage(imageID[i]); 
      playerList.get(calledPlayer).setStatus(statusID[i]); 
     } 
    } 

    updateViewPlayerGUI(); 
} 

Обратите внимание, что ImageID [I] и StatusId [I] имеют в виду Int массивы, содержащие идентификаторы для каждой строки состояния и состояния изображения.

Я могу опубликовать файл xml, но поскольку он длится 124 строки, я бы предпочел не делать этого. Просто знайте, что каждый ImageView в XML-файле имеет идентификатор, поэтому я не могу понять, почему я получаю эти NullPointerExceptions, начиная с части «if (! SelectStatusIVList.isEmpty()) и продолжаю с каждым другой call последующий.

Пожалуйста, помогите!

+0

NPE, как правило, easiers ошибки, чтобы найти, так как он просто говорит вам, что вы пытаетесь назвать то, что не существует. В вашем случае вы говорите, что NPE начинается с вызова: «if (! SelectStatusIVList.isEmpty())», этот самый likley означает, что он не может найти selectStatusIVList. Чтение кода Я не вижу, где вы начинаете этот список. Отправьте этот фрагмент кода, чтобы мы могли посмотреть. Вероятно, вы назвали это неправильным, или список выходит за пределы области. –

+0

Каждый ImageView в dialog_status_icon.xml имеет атрибут onClick = "statusIconClicked", поэтому его ничего не вызывают. Это просто ... там. Ха-ха. Я получил его отсюда: http://android-developers.blogspot.com/2009/10/ui-framework-changes-in-android-16.html (см. «Более простые прослушиватели кликов»). –

+0

Спасибо Джимми, ты определенно полуправильный. Это переменная экземпляра, но я забыл инициировать ее в onCreate(). Однако, после этого, я все еще получаю ошибку NPE, за исключением другой строки. Теперь это происходит, когда я добавляю ImageViews в ArrayList, начиная с: selectStatusIVList.add ((ImageView) statusIconGUI.findViewById (R.id.statusIV0)) ;. –

ответ

1

statusIconGUI, как представляется, основной макет XML вы использовали в setContenView(). Рассмотрят следующую строку:

selectStatusIVList.add((ImageView) statusIconGUI.findViewById(R.id.statusIV0)); 

вы используете findViewbyID на statusIconGUI. Сделайте это вместо этого в экземпляре вида R.layout.dialog_select_icon, который вы надули. так, измените эту строку на:

selectStatusIVList.add((ImageView) view.findViewById(R.id.statusIV0)); 
+1

Большое вам спасибо, это определенно было. Я изменил его, так что LayoutInflater - это переменная экземпляра, а не локальная, и при изменении этого я, должно быть, пропустил это полностью. Потрясающие! –

+0

приветствовать. пожалуйста, поддержите, если вы нашли ответ полезным. :) – Akhil

+0

Если бы я мог. (Видимо, вам нужна репутация 15 ... Я все еще новичок, да.) –

1

Первоначально selectStatusIVList имеет значение NULL. В loadStatusIconGUI проверить его на нуль

if(selectStatusIVList != null){ 
    if (!selectStatusIVList.isEmpty()) 
    { 
     selectStatusIVList.clear();   
    } 
}else{ 

    selectStatusIVList = new ArrrayList<Integer>(); 
}