2011-08-03 6 views
0

현재 내 listview에 대한 체크 박스가 있습니다. BaseAdapter에서 체크 박스 ID를 내 자신의 ID로 설정했습니다. 활동에서이 ID에 액세스 할 때. null 포인터 예외가 발생합니까? 비록 내가 아직 그 null 포인터 예외가 디버그?클릭 한 체크 박스 문제

확인란의 ID를 수동으로 설정할 수 있습니까? 체크 박스에는 메소드 setId (int id)가 있습니다.

checkBox.getId()에서 null 포인터 예외에 대한 의견이 있으십니까? 이것은 내 getView()입니다. 여기서 checkBox id를 설정했습니다.

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

내가 체크 한 CheckBox를 모두 삭제해야하기 때문에이 작업을 수행했습니다.

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() 메서드에 있습니다. 나의 축배는 그것이 null 값을 얻는 것처럼 보여주지 않습니다. – Robin

답변

0

이 당신을 도울 수 있습니다!

그것은 나를 위해 작동 : 체크 박스 위의 XML 변경 이미지 뷰에서

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> 

. 이처럼의 getView 편집 :

의 getView 방법을 당신의 baseAdapter에 : 위의 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; 


      } 
     } 

확인란하고 row.xml에 해당하는 체크 박스 ID로 참조 할 이미지 뷰를 변경합니까 또한 기본 어댑터 클래스에서 onClick 메서드를 얻을 수 있도록 onCLickListener와 함께 BaseAdapter 클래스를 구현하십시오.

희망을 얻으십시오. 혼란을 당신은 전체 코드를 표시 할 수 있습니다 ..

감사

+0

내 시나리오가 약간 다릅니다. 나는 Listbox를 체크 박스없이 초기에 채웠다. 일단 메뉴 편집이 해고되거나 클릭되면, 체크 박스를 선택하면 체크 표시를 지우거나 취소 메뉴를 눌러 체크 박스를 체크하지 않도록 체크 박스를 채울 필요가있다. 그래서 제가 어댑터 클래스에서했던 것은 포스트의 코드에서 위와 같습니다. 선택한 체크 박스 목록 항목을 삭제할 수 없었습니다. 모든 제안이 도움이 될 것입니다 – Robin

+0

viewHolder.checkBox 내 코드로 놀고있는 해결책을 찾았습니다.setOnCheckedChangeListener (새 OnCheckedChangeListener() 공개 무효가 (CompoundButton buttonView 부울의 IsChecked) { \t \t \t \t \t \t 경우 (의 IsChecked)을 {onCheckedChanged \t \t \t \t \t { \t \t \t \t \t \t \t \t \t \t @Override \t \t \t()() .show \t \t \t \t \t \t \t Toast.makeText (, + viewHolder.checkBox.getId()을 Toast.LENGTH_LONG "ID를 선택"상황); \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