最后一项单击空指针异常

时间:2011-07-01 20:00:47

标签: android listview nullpointerexception

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 个答案:

答案 0 :(得分:2)

除非clickedItemPos先前已被调用,否则else之后未定义

clickedItemPos=position。错误发生在哪一行?

答案 1 :(得分:0)

 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在其他地方初始化了吗?因为如果它不是这一行:如果之前没有选择任何内容,则else语句中的viewItem=parent.getChildAt(clickedItemPos);可能为null。我知道你想使用它来检查以前点击的项目,但如果之前没有点击任何内容,这将永远不会被设置为值,因此为null尝试在else语句中执行此操作以避免可能的null变量:< / p>

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行是导致错误的行,该行上的变量是什么?这通常是导致空指针的变量的一个很好的指示器,但由于我们不知道代码的行号,因此很难猜出问题出在哪里。

是的,该解决方案中存在重复的代码,但您可以随时创建一个方法来将重复的代码放入其中并在需要时调用它。

祝你好运,希望这会有所帮助。