繁体   English   中英

如何处理列表视图中的多个复选框

[英]How to handle multiple checkbox in listview

我有一个包含复选框,文本的列表视图...

我的问题与复选框有关,我有一个来自本地数据库的对象(模型)列表,我的模型中有一个布尔值,它告诉我是否需要在复选框中进行检查。我建立列表视图的时刻。 我的问题是从我选中一个框的那一刻起,下一次我进入该视图时,所有复选框都会被选中,或者未选中...

我首先想到我的模型列表有问题,但是它们都是正确的...我不知道为什么...

这是适配器的getView方法:

public View getView(int position, View convertView, ViewGroup parent)
{
    ViewHolder allItems = null;

    if (convertView == null)
    {
        allItems = new ViewHolder();
        convertView = mInflater.inflate(R.layout.row, null);
        allItems.delete = (ImageButton) convertView.findViewById(R.id.deleteItem);
        allItems.chkTick = (CheckBox) convertView.findViewById(R.id.checkBox1);
        allItems.txtName = (TextView) convertView.findViewById(R.id.nameItem);
        allItems.price = (TextView) convertView.findViewById(R.id.priceItem);
        allItems.numberItem = (TextView) convertView.findViewById(R.id.numberItem);
        allItems.plus = (ImageButton) convertView.findViewById(R.id.plusItem);
        allItems.minus = (ImageButton) convertView.findViewById(R.id.minusItem);
        convertView.setTag(allItems);
    }
    else
        allItems = (ViewHolder) convertView.getTag();
    final int pos = position;
    allItems.txtName.setText(this._sqlHelper.getItemById(items.get(position).getItemId()).getName());
    allItems.numberItem.setText(Integer.toString(items.get(position).getQuantity()));
    allItems.chkTick.setChecked(items.get(position).getIsChecked());
    if (tmp != null && tmp.compareTo("TRUE") == 0)
    {
        allItems.price.setVisibility(View.VISIBLE);
        allItems.price.setText("(" + Double.toString(items.get(position).getPrice()) + "€)");
    }
    else
        allItems.price.setVisibility(View.INVISIBLE);
    allItems.chkTick.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
       public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
           items.get(pos).setIsChecked(isChecked);
           getPos(buttonView);
           if (isChecked)
           {
               if (tmp != null && tmp.compareTo("TRUE") == 0)
                   ShowPopup(activity, p, pos);
           }
           _sqlHelper.updateShoppingListItem(items.get(pos));
       }
    });
    allItems.delete.setOnClickListener(new OnClickListener() {
        @Override
        public void onClick(View v) {
            AlertDialog.Builder builder = new AlertDialog.Builder(ListItemsAdaptor.this.activity);
            builder.setCancelable(false);
            builder.setTitle("Delete Item");
            builder.setMessage("Are you sure you want to delete this item ?");
            builder.setPositiveButton("Update", null);
            builder.setNegativeButton("Cancel", null);
            builder.setPositiveButton("Yes", new DialogInterface.OnClickListener() {
                public void onClick(DialogInterface dialog, int id) {
                    _sqlHelper.deleteShoppingListItemByIdItem(items.get(pos).getListId(), items.get(pos).getItemId());
                    items.remove(pos);
                    updateResults(items);
                }
            });
            builder.setNegativeButton("No", new DialogInterface.OnClickListener() {
                public void onClick(DialogInterface dialog, int id) {

                }
            });
            builder.show();
        }
    });
    allItems.plus.setOnClickListener(new OnClickListener() {
        @Override
        public void onClick(View v) {
            items.get(pos).setQuantity(items.get(pos).getQuantity()+ 1);
            updateResults(items);
            _sqlHelper.updateShoppingListItem(items.get(pos));
        }
    });
    allItems.minus.setOnClickListener(new OnClickListener() {
        @Override
        public void onClick(View v) {
            if (items.get(pos).getQuantity() > 1){
                items.get(pos).setQuantity(items.get(pos).getQuantity()- 1);
                updateResults(items);
                _sqlHelper.updateShoppingListItem(items.get(pos));
            }
        }
    });

    return (convertView);
}

谢谢你们的帮助!

我建议您使用私有ListArray的checkedItems并在选中的项中添加或删除,毕竟在代码之后传递或使用此列表Array。

我认为您需要在onCheckedChangeListener中(以及每次更改项目之后notifyDataSetChanged()调用适配器的notifyDataSetChanged()方法。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM