Trong lớp Adapter, chúng ta cần định nghĩa một HashMap để lưu trữ trạng thái chọn của từng dòng:
private static HashMap<Integer, Boolean> itemChecked;
Định nghĩa getter và setter cho HashMap này:
public static void setItemChecked(HashMap<Integer, Boolean> checked) {
ListItemAdapter.itemChecked = checked;
}
public static HashMap<Integer, Boolean> getItemChecked() {
return itemChecked;
}
Trong constructor của Adapter, khởi tạo tất cả giá trị ban đầu là false:
public ListItemAdapter(Context context, List<String> dataList){
this.context = context;
this.dataList = dataList;
itemChecked = new HashMap<Integer, Boolean>();
initializeData();
}
private void initializeData() {
for (int i = 0; i < dataList.size(); i++) {
getItemChecked().put(i, false);
}
}
Trong phương thức getView, xử lý sự kiện khi người dùng nhấn vào CheckBox và cập nhật trạng thái tương ứng:
itemCheckbox = (CheckBox)convertView.findViewById(R.id.itemCheckbox);
itemCheckbox.setOnCheckedChangeListener(new OnCheckedChangeListener(){
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
if (isChecked){
buttonView.setButtonDrawable(R.drawable.checkbox_checked);
itemChecked.put(position, true);
}else{
buttonView.setButtonDrawable(R.drawable.checkbox_unchecked);
itemChecked.put(position, false);
}
}
});
itemCheckbox.setChecked(getItemChecked().get(position));
if (getItemChecked().get(position)){
itemCheckbox.setButtonDrawable(R.drawable.checkbox_checked);
}else{
itemCheckbox.setButtonDrawable(R.drawable.checkbox_unchecked);
}
Trong Activity chính, khi người dùng nhấn vào nút chọn tất cả, gọi phương thức toggleSelectAll để cập nhật trạng thái:
@Override
public void onClick(View v) {
switch (v.getId()){
case R.id.selectAllCheckbox:
toggleSelectAll(selectAllCheckbox.isChecked());
break;
case R.id.deleteButton:
break;
default:
break;
}
}
private void toggleSelectAll(boolean checkAll){
for (int i=0; i<itemList.size(); i++){
mAdapter.getItemChecked().put(i, checkAll);
}
if (selectAllCheckbox.isChecked()){
selectAllCheckbox.setButtonDrawable(R.drawable.checkbox_checked);
}else{
selectAllCheckbox.setButtonDrawable(R.drawable.checkbox_unchecked);
}
mAdapter.notifyDataSetChanged();
}
Dưới đây là mã nguồn hoàn chỉnh.
MainActivity.java:
package com.example.listviewcheckbox;
import android.support.v7.app.ActionBarActivity;
import java.util.ArrayList;
import java.util.List;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.ListView;
public class MainActivity extends ActionBarActivity implements OnClickListener{
private CheckBox selectAllCheckbox;
private Button deleteButton;
private List<String> itemList;
private ListItemAdapter mAdapter;
private ListView listView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initializeViews();
loadData();
mAdapter = new ListItemAdapter(MainActivity.this, itemList);
listView.setAdapter(mAdapter);
}
private void initializeViews(){
selectAllCheckbox = (CheckBox) findViewById(R.id.selectAllCheckbox);
deleteButton = (Button) findViewById(R.id.deleteButton);
listView = (ListView) findViewById(R.id.itemListView);
selectAllCheckbox.setOnClickListener(this);
deleteButton.setOnClickListener(this);
selectAllCheckbox.setButtonDrawable(R.drawable.checkbox_unchecked);
}
private void loadData(){
itemList = new ArrayList<String>();
for (int i=0; i<10; i++){
itemList.add("Dòng dữ liệu thứ " + String.valueOf(i));
}
}
private void toggleSelectAll(boolean checkAll){
for (int i=0; i<itemList.size(); i++){
mAdapter.getItemChecked().put(i, checkAll);
}
if (selectAllCheckbox.isChecked()){
selectAllCheckbox.setButtonDrawable(R.drawable.checkbox_checked);
}else{
selectAllCheckbox.setButtonDrawable(R.drawable.checkbox_unchecked);
}
mAdapter.notifyDataSetChanged();
}
@Override
public void onClick(View v) {
switch (v.getId()){
case R.id.selectAllCheckbox:
toggleSelectAll(selectAllCheckbox.isChecked());
break;
case R.id.deleteButton:
break;
default:
break;
}
}
}
ListItemAdapter.java:
package com.example.listviewcheckbox;
import java.util.HashMap;
import java.util.List;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.CheckBox;
import android.widget.CompoundButton;
import android.widget.TextView;
import android.widget.CompoundButton.OnCheckedChangeListener;
public class ListItemAdapter extends BaseAdapter{
List<String> dataList;
Context context;
private static HashMap<Integer, Boolean> itemChecked;
public ListItemAdapter(Context context, List<String> dataList){
this.context = context;
this.dataList = dataList;
itemChecked = new HashMap<Integer, Boolean>();
initializeData();
}
private void initializeData() {
for (int i = 0; i < dataList.size(); i++) {
getItemChecked().put(i, false);
}
}
@Override
public int getCount() {
return dataList.size();
}
@Override
public Object getItem(int position) {
return dataList.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
CheckBox itemCheckbox;
TextView itemText;
if(convertView == null){
convertView = LayoutInflater.from(context).inflate(R.layout.list_item, null);
}
itemCheckbox = (CheckBox)convertView.findViewById(R.id.itemCheckbox);
itemCheckbox.setOnCheckedChangeListener(new OnCheckedChangeListener(){
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
if (isChecked){
buttonView.setButtonDrawable(R.drawable.checkbox_checked);
itemChecked.put(position, true);
}else{
buttonView.setButtonDrawable(R.drawable.checkbox_unchecked);
itemChecked.put(position, false);
}
}
});
itemCheckbox.setChecked(getItemChecked().get(position));
if (getItemChecked().get(position)){
itemCheckbox.setButtonDrawable(R.drawable.checkbox_checked);
}else{
itemCheckbox.setButtonDrawable(R.drawable.checkbox_unchecked);
}
itemText = (TextView)convertView.findViewById(R.id.itemText);
itemText.setText(dataList.get(position).toString());
return convertView;
}
public static void setItemChecked(HashMap<Integer, Boolean> checked) {
ListItemAdapter.itemChecked = checked;
}
public static HashMap<Integer, Boolean> getItemChecked() {
return itemChecked;
}
}