Android中ListView中有Checkbox時,想獲得item的position,以及全選,反選

想要獲得item的position,其實可以直接settag(position)

全選,反選的話,用一個map集合來存儲Checkbox的狀態即可

首先要自定義好BaseAdapter
如下:

class myBaseAdapter extends BaseAdapter {

        class ViewHolder {
            private ImageView icon;
            private TextView name_Tv, desc_Tv;
            private CheckBox checkBox;
        }

        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            // TODO Auto-generated method stub

            ViewHolder viewHolder;
            TaskInfo taskInfo;
            if (position == 0) {
                TextView view = new TextView(JinChengGuanLiActivity.this);
                view.setText("用戶進程(" + userTaskInfos.size() + ")");
                view.setTextColor(Color.WHITE);
                view.setBackgroundColor(Color.GRAY);
                return view;
            } else if (position == userTaskInfos.size() + 1) {
                TextView view = new TextView(JinChengGuanLiActivity.this);
                view.setText("系統進程(" + systemTaskInfos.size() + ")");
                view.setTextColor(Color.WHITE);
                view.setBackgroundColor(Color.GRAY);
                return view;
            }

            if (convertView != null && convertView instanceof ViewGroup) {
                viewHolder = (ViewHolder) convertView.getTag();
            } else {
                convertView = View.inflate(JinChengGuanLiActivity.this,
                        R.layout.jinchengguanli_listview, null);
                viewHolder = new ViewHolder();
                viewHolder.icon = (ImageView) convertView
                        .findViewById(R.id.jinchengguanli_icon);
                viewHolder.name_Tv = (TextView) convertView
                        .findViewById(R.id.jinchengguanli_name);
                viewHolder.desc_Tv = (TextView) convertView
                        .findViewById(R.id.jinchengguanli_inrom);
                viewHolder.checkBox = (CheckBox) convertView
                        .findViewById(R.id.jinchengguanli_checkbox);
                convertView.setTag(viewHolder);
            }

            if (position <= userTaskInfos.size()) {
                taskInfo = userTaskInfos.get(position - 1);
            } else {
                taskInfo = systemTaskInfos.get(position - userTaskInfos.size()
                        - 2);
            }

            viewHolder.icon.setImageDrawable(taskInfo.getIcon());
            viewHolder.name_Tv.setText(taskInfo.getName());
            viewHolder.desc_Tv.setText("佔用內存" + taskInfo.getMemory());
            viewHolder.checkBox.setTag(position);

            viewHolder.checkBox.setChecked(isCheckMap.get(position));

            viewHolder.checkBox
                    .setOnCheckedChangeListener(new OnCheckedChangeListener() {

                        @Override
                        public void onCheckedChanged(CompoundButton buttonView,
                                boolean isChecked) {
                            // TODO Auto-generated method stub
                            int id = (Integer) buttonView.getTag();
                            isCheckMap.put(id, isChecked);
                        }
                    });

            return convertView;
        }

        @Override
        public long getItemId(int position) {
            // TODO Auto-generated method stub
            return position;
        }

        @Override
        public Object getItem(int position) {
            // TODO Auto-generated method stub
            return null;
        }

        @Override
        public int getCount() {
            // TODO Auto-generated method stub
            return userTaskInfos.size() + systemTaskInfos.size() + 2;
        }
    }

主要看checkbox的監聽那部分
並且在之前通過settag()方法把position存入checkbox中

isCheckBox是一個map集合,HashMap<Integer,Boolean>,存放position,isChecked
所以在getView方法中,我直接設置 checkBox.setChecked(isCheckMap.get(position));
viewHolder.checkBox.setChecked(isCheckMap.get(position));

            viewHolder.checkBox
                    .setOnCheckedChangeListener(new OnCheckedChangeListener() {

                        @Override
                        public void onCheckedChanged(CompoundButton buttonView,
                                boolean isChecked) {
                            // TODO Auto-generated method stub
                            int id = (Integer) buttonView.getTag();
                            isCheckMap.put(id, isChecked);
                        }
                    });

什麼時候初始化的isCheckBox?
在剛開始的時候,我寫了個方法:

private void setCheckBox(boolean isChecked) {
        for (int i = 1; i <= userTaskInfos.size(); i++) {
            isCheckMap.put(i, isChecked);
        }
        for (int j = userTaskInfos.size() + 1; j < userTaskInfos.size()
                + systemTaskInfos.size() + 2; j++) {
            isCheckMap.put(j, isChecked);
        }
    }
我用的是setCheckBox(false),設置初始值都爲false

這樣設置後,再滾動ListView時就不會消失了

如果還要做全選,反選的話
可以根據isCheckBox集合中儲存的key-vale來做對應的操作

全選:就直接
setCheckBox(true);
adapter.notifyDataSetChanged();

反選:

inverse_btn.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                for (int i = 1; i <= userTaskInfos.size(); i++) {
                    isCheckMap.put(i, !isCheckMap.get(i));
                }
                for (int j = userTaskInfos.size() + 1; j < userTaskInfos.size()
                        + systemTaskInfos.size() + 2; j++) {
                    isCheckMap.put(j, !isCheckMap.get(j));
                }
                adapter.notifyDataSetChanged();
            }
        });
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章