Исключение нулевого указателя последнего клика - PullRequest
1 голос
/ 02 июля 2011
listView=(ListView)findViewById(R.id.list);

listView.setOnItemClickListener(new OnItemClickListener(){

    @Override
    public void onItemClick(AdapterView<?> parent, View viewItem, int position, long arg3) {
    if(!itemClicked)
    {

        viewItem = parent.getChildAt(position);
        ((Button)viewItem.findViewById(R.id.gov)).setVisibility(View.VISIBLE);
        ((Button)viewItem.findViewById(R.id.re)).setVisibility(View.VISIBLE);
        viewItem.invalidate();
        itemClicked=true;
        clickedItemPos=position;
        TextView text = (TextView)viewItem.findViewById(R.id.item);
        ime = text.getText();
    }
    else
    {
        viewItem=parent.getChildAt(clickedItemPos);
        ((Button)viewItem.findViewById(R.id.go)).setVisibility(View.INVISIBLE);
        ((Button)viewItem.findViewById(R.id.re)).setVisibility(View.INVISIBLE);

    viewItem = parent.getChildAt(position);
    ((Button)viewItem.findViewById(R.id.go)).setVisibility(View.VISIBLE);
    ((Button)viewItem.findViewById(R.id.re)).setVisibility(View.VISIBLE);
    viewItem.invalidate();
    clickedItemPos=position;
    TextView text = (TextView)viewItem.findViewById(R.id.item);
    ime = text.getText();
    }
    final int[] coordAndCat = FavoriteCoord(ime.toString());

Исключение Nullpointer возникает, когда у меня есть больше элементов и когда вы прокручиваете и щелкаете последний элемент в представлении списка. Как обойти это?

Примечание. Я пытаюсь отобразить 2 кнопки в каждом элементе, который нажимается. Этот код работает для всех кликов по элементам, кроме последнего (если в списке много элементов и вам нужно прокрутить)

Ответы [ 2 ]

2 голосов
/ 02 июля 2011

clickedItemPos не определено после else, если clickedItemPos=position не был вызван ранее. На какой строке происходит ошибка?

0 голосов
/ 02 июля 2011
 listView=(ListView)findViewById(R.id.list);

    listView.setOnItemClickListener(new OnItemClickListener(){

        @Override
        public void onItemClick(AdapterView<?> parent, View viewItem, int position, long arg3) {
        if(!itemClicked)
        {

            viewItem = parent.getChildAt(position);

//start >> This might be where your problem is (R.id.gov)
            ((Button)viewItem.findViewById(R.id.gov)).setVisibility(View.VISIBLE);
//end <<

            ((Button)viewItem.findViewById(R.id.re)).setVisibility(View.VISIBLE);
            viewItem.invalidate();
            itemClicked=true;
            clickedItemPos=position;
            TextView text = (TextView)viewItem.findViewById(R.id.item);
            ime = text.getText();
        }
        else
        {
            viewItem=parent.getChildAt(clickedItemPos);
            ((Button)viewItem.findViewById(R.id.go)).setVisibility(View.INVISIBLE);
            ((Button)viewItem.findViewById(R.id.re)).setVisibility(View.INVISIBLE);

        viewItem = parent.getChildAt(position);
        ((Button)viewItem.findViewById(R.id.go)).setVisibility(View.VISIBLE);
        ((Button)viewItem.findViewById(R.id.re)).setVisibility(View.VISIBLE);
        viewItem.invalidate();
        clickedItemPos=position;
        TextView text = (TextView)viewItem.findViewById(R.id.item);
        ime = text.getText();
        }
        final int[] coordAndCat = FavoriteCoord(ime.toString());

Я думаю, что вы сказали R.id.gov вместо R.id.go, если R.id.gov не является действительно вашим идентификатором.Это единственное, что я увидел «неправильно», пожалуйста, покажите в стеке трассировку для ошибки в следующий раз, это поможет в отладке =)

РЕДАКТИРОВАТЬ clickedItemPos инициализируется где-то еще?потому что, если это не эта строка: viewItem=parent.getChildAt(clickedItemPos); в вашем выражении else, вероятно, будет нулевым, если ничего не было выбрано ранее.Я понимаю, что вы хотите использовать это для проверки ранее нажатых элементов, но если ничего не было щелкнуто ранее, для этого никогда не будет установлено значение и, следовательно, будет null, попробуйте сделать это в этом операторе else, чтобы избежать возможной переменной null:

else
{
    if(clickedItemPos != null){ //only add this if there was a previous clicked item
       viewItem=parent.getChildAt(clickedItemPos);
       ((Button)viewItem.findViewById(R.id.go)).setVisibility(View.INVISIBLE);
       ((Button)viewItem.findViewById(R.id.re)).setVisibility(View.INVISIBLE);

       viewItem = parent.getChildAt(position);
       ((Button)viewItem.findViewById(R.id.go)).setVisibility(View.VISIBLE);
       ((Button)viewItem.findViewById(R.id.re)).setVisibility(View.VISIBLE);
       viewItem.invalidate();
       clickedItemPos=position;
       TextView text = (TextView)viewItem.findViewById(R.id.item);
       ime = text.getText();
    }else{
       viewItem = parent.getChildAt(position);
       ((Button)viewItem.findViewById(R.id.go)).setVisibility(View.VISIBLE);
       ((Button)viewItem.findViewById(R.id.re)).setVisibility(View.VISIBLE);
       viewItem.invalidate();
       clickedItemPos=position;
       TextView text = (TextView)viewItem.findViewById(R.id.item);
       ime = text.getText();
    }

}

, надеюсь, это исправит это.В вашей трассировке стека написано, что строка 91 в вашем классе является строкой, вызывающей ошибку, какая переменная находится в этой строке?обычно это хороший индикатор того, какая переменная вызывает нулевой указатель, но поскольку мы не знаем номеров строк для вашего кода, трудно догадаться, в чем проблема.

Да, в коде есть повторяющийся код.это решение, но вы всегда можете создать метод, чтобы вставить повторный код и вызвать его, если хотите.

Удачи, надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...