@Override protected void onCreate(Bundle savedInstanceState) { // TODO Auto-generated method stub super.onCreate(savedInstanceState); setContentView(R.layout.group_list2); initBottomBar(); listView = (ListView) findViewById(R.id.groupListView); GroupService service = new GroupService(this); groupList = service.getGroupList(null); adapter = new GroupListAdapter(this, groupList); listView.setAdapter(adapter); listView.setOnItemClickListener(new OnItemClickListener() { @Override public void onItemClick(AdapterView<?> adapterView, View view, int position, long arg3) { // TODO Auto-generated method stub Group group = groupList.get(position); CheckBox ctb = (CheckBox) view.findViewById(R.id.checkBox); ctb.toggle(); adapter.selectedMap.put(group.id, ctb.isChecked()); adapter.notifyDataSetChanged(); if(adapter.selectedMap.containsValue(true)){ add2ScanListBtn.setEnabled(true); }else{ add2ScanListBtn.setEnabled(false); } } }); } private void initBottomBar(){ bottomBarView = (LinearLayout) findViewById(R.id.bottomBar); add2ScanListBtn = (Button) bottomBarView.findViewById(R.id.add2ScanListBtn); add2ScanListBtn.setEnabled(false); checkBtn = (Button) bottomBarView.findViewById(R.id.checkBtn); closeCheckBtn = (Button) bottomBarView.findViewById(R.id.closeCheckBtn); add2ScanListBtn.setOnClickListener(this); checkBtn.setOnClickListener(this); closeCheckBtn.setOnClickListener(this); }
@Override public boolean onCreateOptionsMenu(Menu menu) { menu.add(0, MENU_EDITOR, 0, "编辑"); return super.onCreateOptionsMenu(menu); } @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case MENU_EDITOR: setCheckBoxVisible(View.VISIBLE); adapter.notifyDataSetChanged(); break; default: break; } return super.onOptionsItemSelected(item); } @Override public void onClick(View v) { switch (v.getId()) { case R.id.add2ScanListBtn: GroupService service = new GroupService(this); service.add2ScanList(adapter.selectedMap); for (Group group : groupList) { adapter.selectedMap.put(group.id, false); } setCheckBoxVisible(View.GONE); adapter.notifyDataSetChanged(); break; case R.id.checkBtn: CharSequence text = checkBtn.getText(); if (getText(R.string.checkAll).equals(text)) { for (int i = 0; i < adapter.getCount(); i++) { Group group = groupList.get(i); adapter.selectedMap.put(group.id, true); } checkBtn.setText(getText(R.string.checkNeither)); add2ScanListBtn.setEnabled(true); }else if(getText(R.string.checkNeither).equals(text)){ for (int i = 0; i < adapter.getCount(); i++) { Group group = groupList.get(i); adapter.selectedMap.put(group.id, false); } checkBtn.setText(getText(R.string.checkAll)); add2ScanListBtn.setEnabled(false); } adapter.notifyDataSetChanged(); break; case R.id.closeCheckBtn: setCheckBoxVisible(View.GONE); adapter.notifyDataSetChanged(); break; default: break; } }
//设置checkbox是否可见 private void setCheckBoxVisible(int state){ bottomBarView.setVisibility(state); for (int i = 0; i < adapter.getCount(); i++) { Group group = groupList.get(i); adapter.visibleMap.put(group.id, state); } }
class GroupListAdapter extends BaseAdapter{ private Context context; private List<Group> groupList; private Map<Integer, Boolean> selectedMap;//保存checkbox是否被选中的状态 private Map<Integer, Integer> visibleMap ; public GroupListAdapter(Context context, List<Group> groupList) { this.context = context; this.groupList = groupList; selectedMap = new HashMap<Integer, Boolean>(); visibleMap = new HashMap<Integer, Integer>(); for (Group group : groupList) { selectedMap.put(group.id, false); visibleMap.put(group.id, View.GONE); } } @Override public int getCount() { // TODO Auto-generated method stub return groupList.size(); } @Override public Object getItem(int position) { // TODO Auto-generated method stub return position; } @Override public long getItemId(int position) { // TODO Auto-generated method stub return position; } @Override public View getView(int position, View convertView, ViewGroup parent) { final ViewHolder holder; if (convertView == null) { holder = new ViewHolder(); convertView = LayoutInflater.from(context).inflate(R.layout.group_list2_item, null); holder.groupNameCTV = (TextView) convertView.findViewById(R.id.groupNameTV); holder.checkBox = (CheckBox) convertView.findViewById(R.id.checkBox); convertView.setTag(holder); } else { holder = (ViewHolder) convertView.getTag(); } Group group = groupList.get(position); holder.groupNameCTV.setText(group.m_strGroupName); holder.checkBox.setVisibility(visibleMap.get(group.id)); holder.checkBox.setChecked(selectedMap.get(group.id)); return convertView; } private class ViewHolder{ TextView groupNameCTV; CheckBox checkBox; } }
group_list2.xml
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="fill_parent" android:orientation="vertical"> <LinearLayout android:layout_height="0dip" android:layout_width="match_parent" android:layout_weight="1"> <ListView android:id="@+id/groupListView" android:layout_width="match_parent" android:layout_height="match_parent" android:divider="#999999" android:dividerHeight="1sp" /> </LinearLayout> <LinearLayout android:id="@+id/bottomBar" android:layout_height="wrap_content" android:layout_width="match_parent" android:gravity="center_horizontal" android:padding="5dip" android:background="@drawable/buttonbar" android:visibility="gone"> <Button android:id="@+id/add2ScanListBtn" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/add2ScanList"/> <Button android:id="@+id/checkBtn" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/checkAll" /> <Button android:id="@+id/closeCheckBtn" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/cancel" /> </LinearLayout> </LinearLayout>
group_list2_item.xml
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="horizontal" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_gravity="center_horizontal" > <TextView android:id="@+id/groupNameTV" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textSize="20dip" android:layout_alignParentLeft="true" android:textColor="@android:color/white" android:layout_marginTop="12dip" android:layout_marginLeft="5dip" android:paddingBottom="12dip" /> <CheckBox android:id="@+id/checkBox" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentRight="true" android:layout_marginRight="5dip" android:clickable="false" android:focusable="false" android:focusableInTouchMode="false" /> </RelativeLayout>