知道ListView中点击的checkBox项吗?

时间:2013-12-19 22:05:27

标签: java android listview checkbox

我有一个自定义列表视图,其中包含一些元素和一个复选框。当我点击一个按钮。我想知道已经检查过的元素的位置。 以下是我的代码

public class Results extends ListActivity implements OnClickListener{
    String[] donorName,donorPhone;
    int totNumber;
    Button callBut;
    ListView listView;
    List<RowItem> rowItems;
    public static void main(String[] args) {
        // TODO Auto-generated method stub

    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);
        setContentView(R.layout.results);
        Intent intent = getIntent();
          donorName = intent.getStringArrayExtra("name");
          donorPhone = intent.getStringArrayExtra("phone");
          totNumber = intent.getExtras().getInt("totDonors");
          callBut = (Button)findViewById(R.id.callBut);
          callBut.setOnClickListener(this);
          rowItems = new ArrayList<RowItem>();
            for (int i = 0; i < totNumber; i++) {
                RowItem item = new RowItem(donorName[i], donorPhone[i]);
                rowItems.add(item);
            }

            ListAdapter adapter = new MySimpleArrayAdapter(this,
                    R.layout.list_item, rowItems);
            setListAdapter(adapter);


    };
    ///////////////////////////////////////////////////////////////////////////////////////////
    public static class MySimpleArrayAdapter extends ArrayAdapter<RowItem> implements OnCheckedChangeListener {


          Context context;
          static List<RowItem> donorList = new ArrayList<RowItem>();

            public MySimpleArrayAdapter(Context context, int resourceId,
                    List<RowItem> donorList) {
                super(context, resourceId, donorList);
                this.context = context;
                this.donorList = donorList;
            }
            private class ViewHolder {
                Button donorCall,exp;
                TextView donorName;
                TextView donorPhone;
                CheckBox chkBox;

            }
          @Override
          public View getView(final int position, View convertView, ViewGroup parent) {
              ViewHolder holder = null;
                final RowItem rowItem = getItem(position);
            LayoutInflater mInflater = (LayoutInflater) context
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            if (convertView == null) {
                convertView = mInflater.inflate(R.layout.list_item, null);
                holder = new ViewHolder();
                holder.donorName = (TextView) convertView.findViewById(R.id.donorName);
                holder.donorPhone = (TextView) convertView.findViewById(R.id.donorPhone);
                holder.donorCall = (Button) convertView.findViewById(R.id.donorCall);
                holder.chkBox = (CheckBox) convertView.findViewById(R.id.chkBox);
                convertView.setTag(holder);

            }

            else
                holder = (ViewHolder) convertView.getTag();

            holder.donorPhone.setText(rowItem.getdonorPhoneS());
            holder.donorName.setText(rowItem.getdonorNameS());
           holder.chkBox.setTag(position);
           holder.chkBox.setOnCheckedChangeListener(this);
            holder.donorCall.setOnClickListener(new View.OnClickListener(){
                @Override
                public void onClick(View v) {
                    // TODO Auto-generated method stub
                    Log.d("Button Clicked",position+"");
                    Intent startCall = new Intent(Intent.ACTION_CALL);

                    startCall.setData(Uri.parse("tel:" + rowItem.getdonorPhoneS()));
                    context.startActivity(startCall);
                }

            });
            return convertView;
          }
        @Override
        public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
            // TODO Auto-generated method stub
            int position = (Integer) buttonView.getTag();
               if (isChecked) {
                   donorList.get(position).setSelected(true);
                   Log.d("Tag",donorList.get(position).isSelected()+"");
               } else {
                   buttonView.setSelected(false);
                   Log.d("Unchecked",isChecked+"");
               }
               notifyDataSetChanged();
        }

    }
////////////////////////////////////////////////////////////////////////////////////////////////    
    @Override
    public void onClick(View v) {
        // TODO Auto-generated method stub
        String msgRecipient;
        Log.d("MSg","Button Clicked");
        for (int x = 0; x<totNumber;x++){
            if(MySimpleArrayAdapter.donorList.get(x).isSelected()){
                Log.d("position Checked",x+"");
            }
            else
                 Log.d("position UnChecked",x+"");  
        }
    }
}

当我点击某个项目的复选框时,我在 Log 中得到了真的。但是当我点击按钮时,所有元素都显示在未选中状态。

3 个答案:

答案 0 :(得分:2)

您忘记在getView中设置复选框的选中状态,因此如果向下/向上滚动,您将显示旧的复选框,而不会更新。

你需要做的是拥有一组整数(或更好的sparseIntArray),选中复选框时将项目位置添加到其中,并在取消选中时删除。

为了获得所有选中的复选框,只需使用这组整数......

答案 1 :(得分:0)

您可以尝试此操作以了解适配器中的所选项目位置。

                for(int i=0;i<MySimpleArrayAdapter.mCheckStates.size();i++)
                {
                    if(MySimpleArrayAdapter.mCheckStates.get(i)==true)
                    {
                          // i is the position of a checked items

                    }

                }

答案 2 :(得分:0)

这里可能会出现一些问题。

首先,您需要确保将ListView的setChoiceMode(ListActivity内部)设置为默认值以外的值。即:

listView.setChoiceMode(ListView.CHOICE_MODE_SINGLE);

有关详情,请参阅:Losing current selection when calling adapter.notifyDataSetChanged()

此外,您对notifyDataSetChanged()的调用可能会导致您的选择重置,如下所述:Losing current selection of list item after updating the listview items using notifyDataSetChanged