2011-08-03 156 views
0

目前,我有一個在我的listview複選框,從BaseAdapter我已經設置複選框ID與我自己的ID。 當我從活動訪問此ID。我得到空指針異常?雖然我調試我仍然有空指針異常?點擊複選框問題

是否無法手動設置複選框的ID。複選框確實有一個方法 setId(int id)。

關於checkBox.getId()上的空指針異常的任何想法? 這是我的getView(),我已經設置了checkBox id。

viewHolder.checkBox.setId(myList.get(position).getId()); 

On活動我做了這個,因爲我必須刪除所有選中的複選框。

private void deleteCheckItems() { 
    SparseBooleanArray booleanArray = listView.getCheckedItemPositions(); 
    for (int i = 0; i < listView.getCount(); i++) { 
     if (booleanArray.get(i)) 
      Toast.makeText(getBaseContext(), " the selected index is " + i, Toast.LENGTH_SHORT).show(); 
    } 
} 

我從這個方法獲得空指針異常

編輯:我的源代碼是:

public View getView(int position, View view, ViewGroup parent){ 
    ViewHolder viewHolder; 
    if(view==null){ 
     viewHolder = new ViewHolder(); 
     view = layoutInfalter.inflate(R.layout.item_row,null); 
     viewHolder.checkBox = (CheckBox)view.findViewById(R.id.CheckBoxId); 

     if(VIEW_MODE==-1){ 
      viewHolder.checkBox.setVisibility(View.INVISIBLE); 
     }else{ 
      myAdapter.setViewMode(1); 
      viewHolder.checkBox.setVisibility(View.VISIBLE); 
         viewHolder.checkBox.setId(myList.get(position).getId());  

     } 
     viewHolder.text1= (TextView)view.findViewById(R.id.text1); 
     viewHolder.text2 =TextView)view.findViewById(R.id.text2); 
     view.setTag(viewHolder); 

    }else{ 
     viewHolder = (ViewHolder)view.getTag(); 
    } 
    viewHolder.text1.setText(myList.get(position).getText1()); 
    viewHolder.text2.setText(myList.get(position).getText2()); 
    //viewHolder.checkBox.setId(myList.get(position).getId()); 
    return view; 
} 
+0

可以顯示完整的代碼? –

+0

能夠獲得線路號碼。發生錯誤的地方? –

+0

錯誤發生在deleteCheckItem()方法上。我的吐司沒有顯示,因爲它得到空值。 – Robin

回答

0

這可能幫助你!

它爲我的作品:

ROW.xml

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout 
xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="fill_parent" 
android:layout_height="fill_parent" 
android:layout_gravity="center" 
android:background="#ffffff"> 

<RelativeLayout 
android:id="@+id/actionsLayout" 
android:layout_width="wrap_content" 
android:layout_height="fill_parent" 
android:layout_alignParentRight="true" 
android:paddingRight="10dip" 
android:gravity="center" 
android:paddingBottom="10dip"> 

//change it to CheckBox 
    <ImageView 
android:id="@+id/markFav" 
android:layout_width="wrap_content" 
android:layout_height="wrap_content" 
android:src="@drawable/heart"/> 

</RelativeLayout> 

<RelativeLayout 
android:id="@+id/textLayout" 
android:layout_width="fill_parent" 
android:layout_height="fill_parent" 
android:gravity="center_vertical" 
android:layout_toLeftOf="@+id/actionsLayout" 
android:layout_margin="10dip"> 
<TextView 
android:id="@+id/status" 
android:layout_width="wrap_content" 
android:layout_height="wrap_content" 
android:lines="4" 
android:gravity="center_vertical" 
android:ellipsize="end" 
android:textColor="#000000" 
android:text="Row Text Here"/> 
</RelativeLayout> 

    </RelativeLayout> 

在上面的XML變化的ImageView到複選框。在baseAdapter

GetView方法:和編輯您getView喜歡這個

public View getView(int position, View convertView, ViewGroup parent) { 
      // TODO Auto-generated method stub 
      System.out.println("in getView"); 
      ViewHolder holder; 
      if (convertView == null) { 
      convertView = mInflater.inflate(R.layout.row, null); 
      holder = new ViewHolder(); 
      System.out.println("After holder"); 

      holder.name= (TextView) convertView.findViewById(R.id.status); 

    //Change this to Checkbox and also add that checkbox in your ViewHolder and edit your implementation as per required. 
      holder.heart = (ImageView) convertView.findViewById(R.id.image); 
      //do not set on Click Listener if it is a CheckBox 
      holder.heart.setOnClickListener(this); 


      System.out.println("After holder text"); 
      convertView.setTag(holder); 
      } else { 
      holder = (ViewHolder) convertView.getTag(); 

      System.out.println("in else part"); 
      } 
      //convertView.setBackgroundColor((position & 1) == 1 ? Color.WHITE : Color.LTGRAY); 
      System.out.println("After set background"); 

      if(status.size()>0){ 
       holder.name.setText(status.get(position).desc.toString()); 

      } 
      return convertView; 
     } 

     public void onClick(View v) { 
      // TODO Auto-generated method stub 
      switch(v.getId()){ 
      case R.id.markFav: 
       System.out.println("**MARK FAV CLICKED"); 
       break; 


      } 
     } 

在上面getView方法做更改的ImageView到複選框,並參考相應的複選框的ID在你row.xml還可以使用onCLickListener實現您的BaseAdapter類,以便您可以在該基本適配器類中獲得onClick方法。

希望你明白我的觀點。對於任何混亂問我..

感謝
沙阿

+0

我的情況有點不同。我已經填充ListView沒有複選框,一旦菜單編輯被觸發或點擊,我需要填充我的列表中的複選框,以便在選擇我可能刪除的複選框,或者我可能取消選中通過點擊取消菜單複選框。所以我在我的適配器類上做了如上所述的帖子代碼。我無法刪除選中的複選框列表項。任何建議將有幫助 – Robin

+0

我發現一個解決方案,我正在玩我的代碼:viewHolder.checkBox。setOnCheckedChangeListener(新OnCheckedChangeListener(){ \t \t \t \t \t \t \t \t \t \t @覆蓋 \t \t \t \t \t公共無效onCheckedChanged(CompoundButton buttonView,布爾器isChecked){ \t \t \t \t \t \t如果(器isChecked){ \t \t \t \t \t \t \t viewHolder.checkBox.setId(myList.get(position).getId()); \t \t \t \t \t \t \t Toast.makeText(上下文中, 「選擇的ID」 + viewHolder.checkBox.getId(),Toast.LENGTH_LONG).show(); \t \t \t \t \t \t} \t \t \t \t \t \t \t \t \t \t \t} \t \t \t \t});現在我想我應該創建一個可以存儲我的ID的列表。這很好。 – Robin

+0

是的,你的想法很棒..它會工作在Definetely。你試過了嗎? – Shah