ImageView ArrayList дает исключение NullPointerException

1

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

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

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

//this code runs when user clicks a player status icon
public void playerStatusIconClicked(View v)
{
    //loop through buttons to determine which player 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 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 - это, как правило, более простые ошибки для поиска, поскольку он просто говорит вам, что вы пытаетесь вызвать то, чего не существует. В вашем случае вы говорите, что NPE начинается с вызова: «if (! SelectStatusIVList.isEmpty ())», это наиболее вероятно означает, что он не может найти selectStatusIVList. Читая ваш код, я не вижу, где вы инициируете этот список. Разместите этот фрагмент кода, чтобы мы могли посмотреть. Возможно, вы назвали это неправильно, или список выходит за рамки
  • 0
    Каждый ImageView в dialog_status_icon.xml имеет атрибут onClick = "statusIconClicked", поэтому он ничем не вызывается. Это просто ... там. Ха-ха. Я получил его отсюда: android-developers.blogspot.com/2009/10/… (см. « Прослушиватели с простым щелчком мыши »).
Показать ещё 3 комментария
Теги:
arraylist
imageview
layout-inflater

2 ответа

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
    Добро пожаловать. Пожалуйста, подтвердите, если вы нашли ответ полезным. :)
Показать ещё 2 комментария
1

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

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

     selectStatusIVList = new ArrrayList<Integer>();
}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню