点击复选框问题

时间:2011-08-03 05:01:15

标签: android listview checkbox

目前我的listview上有一个复选框,从BaseAdapter我已经设置了我自己的id的复选框ID。 当我从Activity访问此id时。我得到空指针异常?虽然我调试我仍然有空指针异常?

是否无法手动设置复选框的ID。 Checkbox确实有一个方法 setId(int id)。

对checkBox.getId()的空指针异常的任何想法? 这是我的getView(),其中我设置了checkBox id。

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

On Activity我已经这样做因为我必须删除所有已检查的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;
}

1 个答案:

答案 0 :(得分: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更改为CheckBox。并编辑你的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;


            }
        }

在上面的getView方法中,将ImageView更改为复选框,并将其引用到row.xml中相应的复选框id。同时使用onCLickListener实现BaseAdapter类,以便能够在该基本适配器类中获取onClick方法

希望你明白我的观点。任何困惑请问我..

感谢