2011-07-01 35 views
1
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個按鈕。此代碼對除了最後一個項目的所有點擊(如果有列表中的很多元素,你需要滾動)

+0

你是什麼意思「當我有更多的元素」? – AlfredoVR

+1

每當你談到異常時,都會顯示堆棧跟蹤以及你的代碼。 – mibollma

+0

http://pastebin.com/6baVGa4Q這裏是logcat @ alfa64如果元素的數量大於可能的可見項目,那麼我的意思是當我有更多的元素時。 – Regs

回答

2

clickedItemPoselse除非clickedItemPos=position前面已經調用後沒有定義。錯誤發生在哪條線上?

+0

如果 \t { \t \t \t \t viewItem = parent.getChildAt(位置)(itemClicked!); \t \t --->((Button)viewItem.findViewById(R.id.gotherefav))。setVisibility(View.VISIBLE); <-----這一行是錯誤的。 我使用clickedItemPos來存儲以前點擊的項目的位置,所以我可以隱藏按鈕,如果以前的任何項目被點擊(按鈕已經顯示) – Regs

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是真正的你有一個ID。這是我看到的「錯誤」的唯一的事情,請出示錯誤下一次堆棧跟蹤,這將有助於在調試=)

編輯 是初始化別的地方clickedItemPos?因爲如果它不是這條線:如果在之前沒有選擇任何內容,則在您的else語句中的viewItem=parent.getChildAt(clickedItemPos);可能爲空。我知道你想用這個來檢查以前點擊過的項目,但是如果之前沒有點擊過,它將永遠不會被設置爲一個值,因此應該爲null,請嘗試在else語句中執行此操作以避免可能的空變量:

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行是導致錯誤的那一行,那個行上有哪個變量?這通常是什麼變量導致空指針的良好指示器,但是由於我們不知道代碼的行號,很難猜測問題出在哪裏。

是的,在該解決方案中存在重複的代碼,但您始終可以創建一種方法將重複的代碼放入並調用,如果需要的話。

祝你好運,希望這會有所幫助。

+0

修復,問題仍然存在。 – Regs