【问题标题】:Wrong Checkbox selection in Android?Android中的复选框选择错误?
【发布时间】:2012-05-31 17:34:55
【问题描述】:

在我的应用程序中,我选择要订购的商品。我的问题是如果我选中要订购的复选框,甚至还选中了另一个复选框。意味着如果我选择单个 Item ,则会检查两个 Item。

从 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]);


                }

【问题讨论】:

标签: android list listview checkbox


【解决方案1】:

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

查看此链接

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

【讨论】:

    【解决方案2】:

    它是ListView 的基本属性 不仅checkboxes 而且Edittextother input controls 将具有相同的值 list view 中实际发生的事情

    仅创建正在显示的项目。

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

    解决方案 2:

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

    编辑 1:

    设置此属性

    android:choiceMode="multipleChoice"
    

    给你它的 2

    Follow the Link 还有See this Property

    【解决方案3】:

    根据列表视图的行为,它不会保存其项目的状态,因为它们在滚动时 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 是一个数组列表。

    【讨论】:

    • @Anand Tiwari 感谢您的回复。我现在就试试。
    • @Anand Tiwari 你能告诉我如何在 CustomAdapter 中保存 Checkbox 的状态吗?
    • 只需在 BaseAdapter 类中(在构造函数中)创建一个布尔值 itemChecked[] 数组,并通过初始未选中的 false 值进行初始化,然后在 getView() 中使用。
    • 我在 Adapter 类中进行了更改,但在 getView 中我得到了这样的结果:表达式的类型必须是数组类型,但它解析为布尔值
    • Boolean[] itemChecked = new Boolean[size]; Arrays.fill(itemChecked, Boolean.FALSE);将此添加到您的适配器。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-02-22
    • 1970-01-01
    • 2019-09-13
    • 1970-01-01
    • 2016-10-10
    • 2014-09-16
    • 2013-02-25
    相关资源
    最近更新 更多