如何使用Android中的CheckBox在ListView中跟踪已检查的行

时间:2012-09-25 05:21:37

标签: android listview checkbox

目前,我参与了与在线foodItem订购相关的Android应用程序开发。我有一个listView,其中包含以下架构:

itemName1  itemPrice1  checkBox
itemName2  itemPrice2  checkBox
itemName3  itemPrice3  checkBox
             .
             .
             .


          GetYourCart[Button]

我的任务是在用户按下按钮时跟踪每个选定的itemNames的价格和总价。我使用了SparseBooleanArray sbArray = myMenulist.getCheckedItemPositions();,但没有显示任何结果。

我该如何实现?我已经阅读了stackoverflow和其他在线教程中提出的几个问题,但无法得到它。

已编辑:以下是我用于检查结果的所选项目的代码:

btnyourCart.setOnClickListener(new View.OnClickListener() {

            public void onClick(View v) {
                // TODO Auto-generated method stub

                String selected = "";
                int cntChoice = myMenulist.getCount();
                SparseBooleanArray sbArray = myMenulist.getCheckedItemPositions();
                for(int i=0;i<cntChoice;i++){
                    if(sbArray.get(i)) {

                        selected += myMenulist.getItemAtPosition(i).toString() + "\n";



                    }


                }
                Log.e("menu","Items "+selected);
                Toast.makeText(getApplicationContext(), selected, Toast.LENGTH_SHORT).show();


            }
        });

提前致谢!

2 个答案:

答案 0 :(得分:1)

int total=0;

btnyourCart.setOnClickListener(new View.OnClickListener() {

        public void onClick(View v) {
            // TODO Auto-generated method stub

            String selected = "";
            int cntChoice = myMenulist.getCount();
            SparseBooleanArray sbArray = myMenulist.getCheckedItemPositions();
            for(int i=0;i<cntChoice;i++){
                if(sbArray.get(i)) {

                    selected += myMenulist.getItemAtPosition(i).toString() + "\n";

                     total+=myMenulist.get(i).price;

                }


            }
            Log.e("menu","Items "+selected);
            Toast.makeText(getApplicationContext(), selected, Toast.LENGTH_SHORT).show();


        }
    });

现在点击按钮点击事件获得总计。

button.setOnClickListenernew View.OnClickListener() {

        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub

            Toast.makeText(
                    this,
                    ""+total,
                    Toast.LENGTH_LONG).show();

        }
    });

答案 1 :(得分:0)

您需要在getView()方法中使用自定义适配器来将复选框值保留在列表位置并将该值存储在数组中。这将使复选框值与其位置保持一致。

@Override
public View getView(int position, View convertView, ViewGroup parent) {
        View view = null;

        if(convertView == null){
            LayoutInflater inflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            view = inflater.inflate(R.layout.list_layout, null);
            final ViewHolder viewHolder = new ViewHolder();
            viewHolder.checkBox = (CheckBox) view.findViewById(R.id.del_many_task_chk);
            viewHolder.checkBox.setOnCheckedChangeListener(new OnCheckedChangeListener() {
                @Override
                public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                    Model element = (Model) viewHolder.checkBox.getTag();
                    element.isChecked = buttonView.isChecked();
                }
            });
            view.setTag(viewHolder);
            viewHolder.checkBox.setTag(list.get(position));
        }else{
            view = convertView;
            ((ViewHolder)view.getTag()).checkBox.setTag(list.get(position));
        }
        ViewHolder holder = (ViewHolder) view.getTag();
        holder.checkBox.setChecked(list.get(position).isChecked);
        return view;
    }

现在,当需要知道选中哪个复选框时,您需要使用迭代器浏览列表项。根据复选框值获取已选中和未选中的项目。

for(int i=0;i<list.size();i++){
    if(all_task_list.get(i).isChecked){
         // to do things for checked item
    }else{
         // to do things for uncheck item
    }
}