Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> Android

Cách bind dữ liệu từ database vào CheckBox trong ListView Android

Ví dụ này minh họa cách hiển thị danh sách có CheckBox trong ListView, dữ liệu từ model (giả lập database) với CustomAdapter.

Bước 1: Tạo dự án mới

Tạo dự án mới trong Android Studio.

Bước 2: Layout chính (res/layout/activity_main.xml)

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout 
    xmlns:android="https://schemas.android.com/apk/res/android"
    xmlns:app="https://schemas.android.com/apk/res-auto"
    xmlns:tools="https://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">
    <ListView
        android:id="@+id/listView"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        tools:ignore="MissingConstraints" />
</androidx.constraintlayout.widget.ConstraintLayout>

Bước 3: Layout item (res/layout/row_item.xml)

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="https://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:padding="10dp">
    <TextView
        android:id="@+id/txtName"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentStart="true"
        android:layout_centerVertical="true"
        android:textSize="16sp" />
    <CheckBox
        android:id="@+id/checkBox"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentEnd="true"
        android:layout_alignParentTop="true" />
</RelativeLayout>

Bước 4: Model DataModel.java

package com.app.sample;
public class DataModel {
    public String name;
    public boolean checked;
    
    public DataModel(String name, boolean checked) {
        this.name = name;
        this.checked = checked;
    }
}

Bước 5: CustomAdapter.java

package com.app.sample;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.CheckBox;
import android.widget.TextView;
import androidx.annotation.NonNull;
import java.util.ArrayList;

public class CustomAdapter extends ArrayAdapter {
    private ArrayList dataSet;
    private Context mContext;
    
    static class ViewHolder {
        TextView txtName;
        CheckBox checkBox;
    }
    
    public CustomAdapter(ArrayList data, Context context) {
        super(context, R.layout.row_item, data);
        this.dataSet = data;
        this.mContext = context;
    }
    
    @Override
    public int getCount() {
        return dataSet.size();
    }
    
    @Override
    public DataModel getItem(int position) {
        return dataSet.get(position);
    }
    
    @Override
    public View getView(int position, View convertView, @NonNull ViewGroup parent) {
        ViewHolder viewHolder;
        View result;
        
        if (convertView == null) {
            viewHolder = new ViewHolder();
            convertView = LayoutInflater.from(parent.getContext()).inflate(R.layout.row_item, parent, false);
            viewHolder.txtName = convertView.findViewById(R.id.txtName);
            viewHolder.checkBox = convertView.findViewById(R.id.checkBox);
            result = convertView;
            convertView.setTag(viewHolder);
        } else {
            viewHolder = (ViewHolder) convertView.getTag();
            result = convertView;
        }
        
        DataModel item = getItem(position);
        viewHolder.txtName.setText(item.name);
        viewHolder.checkBox.setChecked(item.checked);
        
        // Xử lý click checkbox
        viewHolder.checkBox.setOnClickListener(v -> {
            item.checked = ((CheckBox) v).isChecked();
        });
        
        return result;
    }
}

Bước 6: MainActivity.java

package com.app.sample;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ListView;
import java.util.ArrayList;

public class MainActivity extends AppCompatActivity {
    ArrayList dataModels;
    ListView listView;
    CustomAdapter adapter;
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        listView = findViewById(R.id.listView);
        dataModels = new ArrayList<>();
        
        // Dữ liệu mẫu (thay bằng query database thực tế)
        dataModels.add(new DataModel("Apple Pie", false));
        dataModels.add(new DataModel("Banana Bread", false));
        dataModels.add(new DataModel("Cupcake", false));
        dataModels.add(new DataModel("Donut", true));
        dataModels.add(new DataModel("Eclair", true));
        dataModels.add(new DataModel("Froyo", true));
        // ... thêm các item khác
        
        adapter = new CustomAdapter(dataModels, getApplicationContext());
        listView.setAdapter(adapter);
        
        // Click item để toggle checkbox
        listView.setOnItemClickListener((parent, view, position, id) -> {
            DataModel model = dataModels.get(position);
            model.checked = !model.checked;
            adapter.notifyDataSetChanged();
        });
    }
}

Bước 7: Manifest

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="https://schemas.android.com/apk/res/android"
    package="com.app.sample">
    <application ...>
        <activity android:name=".MainActivity">...</activity>
    </application>
</manifest>

Chạy ứng dụng

ListView hiển thị tên kèm CheckBox, click item hoặc checkbox đều toggle trạng thái.

Cách bind dữ liệu từ database vào CheckBox trong ListView Android