Triển khai chức năng chọn tất cả/bỏ chọn tất cả cho CheckBox trong ListView

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;  
    }
}

Thẻ: Android ListView checkbox Adapter Java

Đăng vào ngày 7 tháng 7 lúc 07:26