Android中选中了错误的复选框?

时间:2012-05-25 06:05:23

标签: android list listview checkbox

在我的应用中,我选择了要订购的商品。我的问题在于,如果我检查Checkbox to Order,那么另一个复选框也已被检查。意味着如果我选择单个项目,则会检查两个项目。

开始5个项目时,它会被正确检查并显示在订购页面中。从第6项开始如果我选择它正在订购页面中显示其他项目。

这是我的清单代码:

    public View getView(final int position, View convertView, ViewGroup parent) {
        View view = convertView;
        final ViewHolder viewHolder;
        if (view == null) {         
              view = inflater.inflate(R.layout.appetiserlistview, null);
            viewHolder = new ViewHolder();
            viewHolder.image=(ImageView)view.findViewById(R.id.appetiserimage);
            viewHolder.text = (TextView) view.findViewById(R.id.appetisertext);
            viewHolder.desc=(TextView)view.findViewById(R.id.appetiserdesc);
            viewHolder.price=(TextView)view.findViewById(R.id.appetiserprice);
            viewHolder.checkbox = (CheckBox) view.findViewById(R.id.bcheck);


            view.setTag(viewHolder);
        } else {
            viewHolder = (ViewHolder) view.getTag();
        }






        viewHolder.image.setImageBitmap(bmps[position]);

        viewHolder.price.setText(prices[position]);
        viewHolder.desc.setText(descs[position]);
        viewHolder.checkbox.setTag(itemnames[position]);
        ViewHolder holder = (ViewHolder) view.getTag();
        holder.text.setText(itemnames[position]);
        viewHolder.checkbox.setOnClickListener(new OnClickListener() {

            public void onClick(View v) {
                // TODO Auto-generated method stub
                if (((CheckBox) v).isChecked())
                {
                    arr.add(itemnames[position]);
                    itemprice.add(prices[position]);
                       image.add(bmps[position]);


                }

3 个答案:

答案 0 :(得分:0)

根据listview的每个行为,它不会保存其项目的状态,因为它们在滚动时的Inflayet上,所以你应该使用一个布尔值数组来保持复选框的状态,

public class FriendListAdapter extends BaseAdapter {
    private LayoutInflater mInflater;
    private boolean isCheck[] = new boolean[Data.fbFriendList.size()];
 // Data.fbFriendList is arraylist contains data
    public FriendListAdapter() {

        mInflater = LayoutInflater.from(mContext);
        Arrays.fill(isCheck, Boolean.FALSE);
    }

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

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

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

    @Override
    public View getView(final int position, View convertView,
            ViewGroup parent) {
        View hView = convertView;
        if (convertView == null) {
            hView = mInflater.inflate(R.layout.friend_item, null);
            ViewHolder holder = new ViewHolder();
            holder.profile_pic = (ImageView) hView
                    .findViewById(R.id.profile_pic);
            holder.name = (TextView) hView.findViewById(R.id.name);
            holder.checkBox = (CheckBox) hView.findViewById(R.id.checkBox);
            hView.setTag(holder);
        }

        final ViewHolder holder = (ViewHolder) hView.getTag();

        if (isCheck[position]) {
            holder.checkBox.setChecked(true);
        } else {
            holder.checkBox.setChecked(false);
        }

        try {
            holder.profile_pic.setImageBitmap(Utility.model.getImage(
                    Data.fbFriendList.get(position).getFbFriendFBid(),
                    Data.fbFriendList.get(position)
                            .getFbFriendThumbImgUrl()));
            holder.name.setText(Data.fbFriendList.get(position)
                    .getFbFriendName());

        } catch (Exception e) {
            e.printStackTrace();
            holder.name.setText("");
        }

        holder.checkBox.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                if (holder.checkBox.isChecked())
                    isCheck[position] = true;
                else
                    isCheck[position] = false;
            }
        });

        return hView;
    }

}

class ViewHolder {
    ImageView profile_pic;
    TextView name;
    CheckBox checkBox;
}

这里的isCheck []是一个布尔数组,用于在Adapter类中保存复选框的状态,Data.fbFriendList是一个arraylist。

答案 1 :(得分:0)

它是ListView的基本属性 不仅checkboxes而且Edittextother input controls具有与之相同的值 在list view

中实际发生了什么

仅显示正在显示的项目。

当您scroll创建新项目时,按照之前的显示状态,选中一个复选框以获取当前显示。 解决方案1: 创建一个list store the states of all checkboxes(or list items),并在调用bindview() method时检查复选框的状态,并根据列表检查并取消选中它们,同时创建checkbox listener以便{{1}事件更改列表中复选框(或列表项)的状态,这样就可以获得解决方案

解决方案2:

如果只需要一个复选框,则可以使用启用多项选择的listview属性

修改1:

设置此属性

oncheckchange

为你的2

Follow the Link 还有See this Property

答案 2 :(得分:0)

您必须保存所有复选框的状态并相应地恢复它们。这是我已经发布的一个例子。如果您遇到任何问题,请告诉我。我会尽力帮助你。

检查此链接

How to implement a button that gets all checkbox's state and adds the value of checked item into arraylist?