如何获取从listview检查的已检查项目?

时间:2013-11-27 11:33:50

标签: android listview checkboxlist custom-adapter

您好我正在尝试获取已检查的项目并存储在数据库中,但是当我单击按钮保存以获取每次检查的项目大小时,每次大小为零。当单击列表项时,它仅选中项目的唯一大小,但是如果未选中项目则仍然如此。 所以它为我创造的问题帮助我谢谢。 这是我的代码

CustomAdapter.java

public class CustomAdapter extends ArrayAdapter<ContactDetails>{

    List<ContactDetails> listcontacts=null;
    private LayoutInflater mInflater=null;
    private SparseBooleanArray mSelectedItemsIds;

    public CustomAdapter(Activity context, List<ContactDetails> list) {
        super(context, 0);
        mInflater = context.getLayoutInflater();
        mSelectedItemsIds = new SparseBooleanArray(list.size());
        this.listcontacts=list;
    }

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

     @Override
     public View getView(int position, View convertView, ViewGroup parent) {

            View view = null;
            if (convertView == null) {

              view = mInflater.inflate(R.layout.contacts_row, null);
              final ViewHolder viewHolder = new ViewHolder();
              viewHolder.txtname = (TextView) view.findViewById(R.id.textView_name);
              viewHolder.txtphonenum = (TextView) view.findViewById(R.id.textView_phonenum);
              viewHolder.checkbox = (CheckBox) view.findViewById(R.id.checkBox_check);
              viewHolder.checkbox.setFocusable(false);
              viewHolder.checkbox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {

                    @Override
                    public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                      ContactDetails element = (ContactDetails) viewHolder.checkbox.getTag();
                      element.setSelected(buttonView.isChecked());


                    }
                  });

              view.setTag(viewHolder);
              viewHolder.checkbox.setTag(listcontacts.get(position));
            } else {
              view = convertView;
              ((ViewHolder) view.getTag()).checkbox.setTag(listcontacts.get(position));
            }
            ViewHolder holder = (ViewHolder) view.getTag();
            holder.txtname.setText(listcontacts.get(position).getName());
            holder.txtphonenum.setText(listcontacts.get(position).getPhonenumber());
            holder.checkbox.setChecked(listcontacts.get(position).isSelected());
            return view;
    }

     private static class ViewHolder {

            TextView txtname;
            TextView txtphonenum;
            CheckBox checkbox;

        }
}

MuListview类是

    public class AddChoiceContactList extends Activity implements OnClickListener, OnItemClickListener{

        private ListView listview=null;
        private Context context=null;
        private DataBaseHelper db=null;
        CustomAdapter adapter=null;
        private Button btnsave=null;

        List<ContactDetails> list=new ArrayList<ContactDetails>();
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.choicelist);
            context=this;

            listview =(ListView)findViewById(R.id.listView_choice);
            btnsave=(Button)findViewById(R.id.button_save);
            btnsave.setOnClickListener(this);
            listview.setOnItemClickListener(this);


        }
        @Override
        protected void onResume() {
            super.onResume();

            list=db.GetDataContacts();
            if(list.size()>0){
                //listview=getListView();
                Toast.makeText(context, "size is: "+list.size(), Toast.LENGTH_LONG).show();
                adapter=new CustomAdapter(AddChoiceContactList.this, list);
                listview.setAdapter(adapter);
                listview.setItemsCanFocus(false);
                listview.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);

            }
            else{
                Toast.makeText(context, "No Contacts Add contats plz!", Toast.LENGTH_LONG).show();
            }
        }


        @Override
        public void onClick(View arg0) {

           SparseBooleanArray checked=listview.getCheckedItemPositions();
 // here m getting size zero when checked then         Toast.makeText(context, "checked size is: "+checked.size(), Toast.LENGTH_LONG).show();
           ArrayList<UpdatedContact> selectedItems = new ArrayList<UpdatedContact>();
           for (int i = 0; i < checked.size(); i++) {
               int position = checked.keyAt(i);
               if (checked.valueAt(i)){
                  ContactDetails detils=adapter.getItem(position);

               } 
           }

        @Override
        public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) {

        }

    }

2 个答案:

答案 0 :(得分:1)

首先将列表ArrayList<ContactDetails> checkedList作为gloabl并在consstructor中初始化..

在自定义适配器

中编写如下方法
private ArrayList<ContactDetails> getCheckedItems() {
    return checkedList;
}

并像这样更改你的复选框更改监听器..

checkBox.setOnCheckedChangeListener(new OnCheckedChangeListener() {

        @Override
        public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
        if (isChecked) {
            checkedList.add(list.get(position));
        }else {
            checkedList.remove(list.get(position));
        }   
        }
    });

并在adapter.getCheckedItems();

onItemClickListener中致电Activity

然后您将获得所有已检查的项目..

答案 1 :(得分:0)

请尝试这样的事情。

  1. 在您的主要活动上有一个静态HashMap。
  2. 对您的活动实施两种方法,AddSelection和RemoveSelection
  3. 在适配器上,实现onCheckedStateChanged侦听器,并根据列表中的位置从地图执行添加或删除。
  4. 在您的活动中:

        private static HashMap<Integer,Integer> selectedPositions = new HashMap<Integer,Integer>();
        public static boolean isSelected(int position){
            System.out.println("#### Position: " + position + " Value: " + selectedPositions.containsKey(position));
            return selectedPositions.containsKey(position);
        }
    
        public static void addSelection(int position){
            System.out.println("#### Puttin Position: " + position);
            selectedPositions.put(position,position);
        }
    
    public static void removeSelection(int position){
        System.out.println("#### Removing Position: " + position);
        selectedPositions.remove(position);
    }
    

    在适配器中:

    checkbox.setChecked(MainActivity.isSelected(position));
    
    checkbox.setOnCheckedChangeListener(new OnCheckedChangeListener(){
    
        @Override
        public void onCheckedChanged(CompoundButton view, boolean state) {
            // TODO Auto-generated method stub
            if(state == true){
                MainActivity.addSelection(position);
            }else{
                MainActivity.removeSelection(position);
            }
        }
    
    });
    

    现在就是这样,每当你想要遍历hasmap找到所选项目时,确保你在完成工作时清除它,否则你将一次又一次地堆积选定的位置。

相关问题