复选框未正确检查。 Android的

时间:2013-11-27 07:27:23

标签: android checkbox android-listview

我为listview实现了cutomAdapter。我在里面实现了一些复选框。问题是,当我选中第一个位置的复选框时,会检查其他一些复选框。

这是我的适配器......

    public class AScustomadapter extends BaseAdapter {

private ArrayList<String> mListItems;
private LayoutInflater mLayoutInflater;
int i = 0;

public AScustomadapter(Context context, ArrayList<String> arrayList){
    mListItems = arrayList;
    //get the layout inflater
    mLayoutInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}

@Override
public int getCount() {
    return mListItems.size();
}

@Override
public Object getItem(int i) {
    return null;
}

@Override
public long getItemId(int i) {
    return 0;
}

@Override
public View getView(final int position, View view, ViewGroup viewGroup) {
    // create a ViewHolder reference
    ViewHolder holder;

    //check to see if the reused view is null or not, if is not null then reuse it
    if (view == null) {
        holder = new ViewHolder();

        view = mLayoutInflater.inflate(R.layout.list_item, null);
        holder.itemName = (TextView) view.findViewById(R.id.list_item_text_view);

        holder.b1 = (Button) view.findViewById(R.id.button1);
        holder.cb1 = (CheckBox) view.findViewById(R.id.checkBox1);

        // the setTag is used to store the data within this view
        view.setTag(holder);
    } else {
        // the getTag returns the viewHolder object set as a tag to the view
        holder = (ViewHolder)view.getTag();
    }

    //get the string item from the position "position" from array list to put it on the TextView
    final String stringItem = mListItems.get(position);

    if (stringItem != null) {
        if (holder.itemName != null) {
            //set the item name on the TextView
            holder.itemName.setText(stringItem);
        }
    }

    //button
    holder.b1.setOnClickListener(new OnClickListener() {
        @Override
        public void onClick(View v) {
            Intent i = new Intent(v.getContext(), ASreviewCA.class);
            i.putExtra("sItem", stringItem);
            v.getContext().startActivity(i);
        }
    });

    //view
    view.setOnClickListener(new OnClickListener() {
        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub
            if (position == 0) { 
            }
            Log.d("LIST", "Selected item # " + position);
        }
    });

    holder.cb1.setOnCheckedChangeListener(new OnCheckedChangeListener() {

        @Override
        public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
            // TODO Auto-generated method stub
            if (isChecked) {
                i++;
                Toast toast = Toast.makeText(buttonView.getContext(), String.valueOf(i), Toast.LENGTH_SHORT);
                toast.show();

            }else {
                i--;
                Toast toast = Toast.makeText(buttonView.getContext(), String.valueOf(i), Toast.LENGTH_SHORT);
                toast.show();
            }
        }
    });

    //this method must return the view corresponding to the data at the specified position.
    return view;
}
/**
 * Static class used to avoid the calling of "findViewById" every time the getView() method is called,
 * because this can impact to your application performance when your list is too big. The class is static so it
 * cache all the things inside once it's created.
 */
private static class ViewHolder {

    protected TextView itemName;
    protected Button b1;
    protected CheckBox cb1;

}

}

2 个答案:

答案 0 :(得分:1)

为Adapter类中的已检查位置维护一个ArrayList,并在getView()方法中检查已检查的位置。喜欢......

private ArrayList<Integer> checkedIndices = new ArrayList<Integer>();
.......

@Override
public View getView(final int position, View view, ViewGroup viewGroup) {
// create a ViewHolder reference
ViewHolder holder;

//check to see if the reused view is null or not, if is not null then reuse it
if (view == null) {
    holder = new ViewHolder();

    view = mLayoutInflater.inflate(R.layout.list_item, null);
    holder.itemName = (TextView) view.findViewById(R.id.list_item_text_view);

    holder.b1 = (Button) view.findViewById(R.id.button1);
    holder.cb1 = (CheckBox) view.findViewById(R.id.checkBox1);

    // the setTag is used to store the data within this view
    view.setTag(holder);
} else {
    // the getTag returns the viewHolder object set as a tag to the view
    holder = (ViewHolder)view.getTag();
}

//get the string item from the position "position" from array list to put it on the TextView
final String stringItem = mListItems.get(position);

if (stringItem != null) {
    if (holder.itemName != null) {
        //set the item name on the TextView
        holder.itemName.setText(stringItem);
    }
}

//button
holder.b1.setOnClickListener(new OnClickListener() {
    @Override
    public void onClick(View v) {
        Intent i = new Intent(v.getContext(), ASreviewCA.class);
        i.putExtra("sItem", stringItem);
        v.getContext().startActivity(i);
    }
});

//view
view.setOnClickListener(new OnClickListener() {
    @Override
    public void onClick(View v) {
        // TODO Auto-generated method stub
        if (position == 0) { 
        }
        Log.d("LIST", "Selected item # " + position);
    }
});

holder.cb1.setOnCheckedChangeListener(new OnCheckedChangeListener() {

    @Override
    public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
        // TODO Auto-generated method stub
        if (isChecked) {
            Toast toast = Toast.makeText(buttonView.getContext(), "Checked = "+position, Toast.LENGTH_SHORT);
            toast.show();
            checkedIndices.add(position);

        }else {
            Toast toast = Toast.makeText(buttonView.getContext(), "Unchecked = "+position, Toast.LENGTH_SHORT);
            toast.show();
            checkedIndices.remove((Integer)position));
        }
    }
});
if(checkedIndices.contains((Integer)position) {
    holder.cb1.setChecked(true);
} else {
    holder.cb1.setChecked(false);
}

//this method must return the view corresponding to the data at the specified position.
return view;

}

在Adapter类中编写一个方法,如...

 public int getTotalCheckedCount() {
      return checkedIndices.size();
 }

答案 1 :(得分:0)

为了避免ListView中的CheckBoxes出现问题,您可以在开头使用一个初始化为false的布尔数组,然后在ListView中选中复选框的数组中的相应位置为true。当您在应用程序中向前和向后移动或滚动ListView时,这不会导致复选框的选中状态出现问题。您可以在此处查看我的示例代码:

Android checkbox multiselected issue