ListView+复选框CheckBox+全选+显示选择数量

 

 

 一、复选框按钮添加回调

1.在Adapter中创建接口

public interface OnCall {
    public void setInfo(boolean isChecked, int position);
}

2.定义接口

OnCall onCall;

3.创建set赋值方法

public void setOnCall(OnCall onCall) {
    this.onCall = onCall;
}

4.添加监听

viewHolder.checkBox.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        targets.get(position).setChecked(!targets.get(position).isChecked());
        onCall.setInfo(targets.get(position).isChecked(), position);
    }
});

二、Actiivty

1.获取参数

selectPieAdapter.setOnCall((isChecked, position) -> {
    targets.get(position).setChecked(isChecked);
    if(isChecked){
        num++;
    }else{
        num--;
    }
    tvNum.setText("添加 ("+num+")");
});

2.全选点击事件

selectAll.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        int count = 0;
        for (SelectTargetModel target : targets) {
            if(target.isChecked()){
                count++;
            }
        }
        if(count == targets.size()){
            for (SelectTargetModel target : targets) {
                target.setChecked(false);
            }
            num = 0;
            tvNum.setText("添加 ("+num+")");
        }else{
            for (SelectTargetModel target : targets) {
                target.setChecked(true);
            }
            num = targets.size();
            tvNum.setText("添加 ("+num+")");
        }
        selectPieAdapter.notifyDataSetChanged();
    }
});

完整代码

1.Adapter

public class SelectPieAdapter extends BaseAdapter {
    private List<SelectTargetModel> targets = new ArrayList<>();
    private int itemId;
    private Context context;
    private ViewHolder viewHolder;
    OnCall onCall;

    public void setOnCall(OnCall onCall) {
        this.onCall = onCall;
    }

    public SelectPieAdapter(List<SelectTargetModel> targets, int itemId, Context context){
        this.targets = targets;
        this.itemId = itemId;
        this.context =context;
    }
    @Override
    public int getCount() {
        if(null!=targets){
            return targets.size();
        }
        return 0;
    }

    @Override
    public Object getItem(int position) {
        if(null!=targets){
            return targets.get(position);
        }
        return null;
    }

    @Override
    public long getItemId(int position) {
        return position;
    }

    @Override
    public View getView(final int position, View convertView, ViewGroup parent) {
        if (convertView==null){
            convertView = LayoutInflater.from(context).inflate(itemId,null);
            viewHolder = new ViewHolder();
            viewHolder.tvName = convertView.findViewById(R.id.tv_target_name);
            viewHolder.checkBox = convertView.findViewById(R.id.cb_select);
            convertView.setTag(viewHolder);
        }else {
            viewHolder=(ViewHolder) convertView.getTag();
        }
        viewHolder.tvName.setText(targets.get(position).getTarget().getName());
        viewHolder.checkBox.setChecked(targets.get(position).isChecked());
        viewHolder.checkBox.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                targets.get(position).setChecked(!targets.get(position).isChecked());
                onCall.setInfo(targets.get(position).isChecked(), position);
            }
        });
        return convertView;
    }
    private class ViewHolder{
        private TextView tvName;
        private CheckBox checkBox;
    }

    public interface OnCall {
        public void setInfo(boolean isChecked, int position);
    }
}

2.Activity(多余代码为小组件appwidget配置)

public class PieChartConfigure extends Activity {
    private String TAG = "ConfigureActivity";
    private int appWidgetId = AppWidgetManager.INVALID_APPWIDGET_ID;
    ListView lvTargets;
    SelectPieAdapter selectPieAdapter;
    List<SelectTargetModel> targets = new ArrayList<>();
    LinearLayout llBack;
    LinearLayout selectAll;
    TextView tvNum;
    int num = 0;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.configure_pie);
        findViews();
        Intent intent = getIntent();
        Bundle extras = intent.getExtras();
        //1.从Launched Activity(主屏) 找到 Widget ID (保存在Launched Activity Intent extras 的EXTRA_APPWIDGET_ID)
        if (extras != null) {
            appWidgetId = extras.getInt(
                    AppWidgetManager.EXTRA_APPWIDGET_ID,
                    AppWidgetManager.INVALID_APPWIDGET_ID);
        }
        //判断app widget ID是否为空.(App Widget 是否添加到Launched Activity)
        if (appWidgetId == AppWidgetManager.INVALID_APPWIDGET_ID) {
            finish();
            return;
        }

    }


    public static Date strToDate(String str) {

        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        Date date = null;
        try {
            date = format.parse(str);
        } catch (ParseException e) {
            e.printStackTrace();
        }
        return date;
    }

    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        if ((keyCode == KeyEvent.KEYCODE_BACK)) {
            Log.e(TAG, "捕获返回");
            setResult(RESULT_CANCELED);
            finish();
            return false;
        } else {
            return super.onKeyDown(keyCode, event);
        }
    }

    private void findViews() {
        tvNum = findViewById(R.id.tv_select_num);
        tvNum.setText("添加 ("+num+")");
        targets.add(new SelectTargetModel(new SimpleTargetModel("考上北京大学"),false));
        targets.add(new SelectTargetModel(new SimpleTargetModel("四级"),false));
        targets.add(new SelectTargetModel(new SimpleTargetModel("教师资格证"),false));
        targets.add(new SelectTargetModel(new SimpleTargetModel("六级"),false));
        targets.add(new SelectTargetModel(new SimpleTargetModel("对外经贸考研"),false));
        targets.add(new SelectTargetModel(new SimpleTargetModel("减肥"),false));
        lvTargets = findViewById(R.id.lv_pie);
        selectPieAdapter = new SelectPieAdapter(targets,R.layout.item_select_pie,this);
        selectPieAdapter.setOnCall((isChecked, position) -> {
            targets.get(position).setChecked(isChecked);
            if(isChecked){
                num++;
            }else{
                num--;
            }
            tvNum.setText("添加 ("+num+")");
        });
        lvTargets.setAdapter(selectPieAdapter);
        lvTargets.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
                Log.e(TAG, ""+i+"被点击");
                config();
                finishConfigure();
            }
        });
        selectAll = findViewById(R.id.ll_select_all);
        selectAll.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                int count = 0;
                for (SelectTargetModel target : targets) {
                    if(target.isChecked()){
                        count++;
                    }
                }
                if(count == targets.size()){
                    for (SelectTargetModel target : targets) {
                        target.setChecked(false);
                    }
                    num = 0;
                    tvNum.setText("添加 ("+num+")");
                }else{
                    for (SelectTargetModel target : targets) {
                        target.setChecked(true);
                    }
                    num = targets.size();
                    tvNum.setText("添加 ("+num+")");
                }
                selectPieAdapter.notifyDataSetChanged();
            }
        });
    }

    private void finishConfigure() {
        //最后,创建返回 Intent,为其设置 Activity 结果,然后结束该 Activity
        Intent resultValue = new Intent();
        resultValue.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId);
        setResult(RESULT_OK, resultValue);
        finish();
    }
    private void config() {
        //配置完 Widget 配置,拿到AppWidgetManager实例
        AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(PieChartConfigure.this);
        //通过调用updateAppWidget(int,RemoteViews)通过RemoteViews布局更新App Widget
        RemoteViews views = new RemoteViews(PieChartConfigure.this.getPackageName(),
                R.layout.pie_chart_widget);

        ArrayList<PieDate> pieDateList = new ArrayList<>();
        pieDateList.add(new PieDate("英语英语英语英语英语 英语英语英语英语英语英语英语",10));
        pieDateList.add(new PieDate("数学数学数学数学数学数学数学数学",8));
        pieDateList.add(new PieDate("语文语 文语文语文语文",6));
        pieDateList.add(new PieDate("政治政治政治政治政治政治",5));
        pieDateList.add(new PieDate("历史历 史历史",4));
        pieDateList.add(new PieDate("地理地理",3));
        pieDateList.add(new PieDate("生物生物",2));
        pieDateList.add(new PieDate("化学化学化学化学",1));

        views.setImageViewBitmap(R.id.img_pie_chart, DrawUtils.pieCart(pieDateList));
        appWidgetManager.updateAppWidget(appWidgetId, views);

        finishConfigure();
    }
}

3.布局文件

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout android:layout_width="match_parent"
    android:layout_height="match_parent"
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical">
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="44dp">
        <LinearLayout
            android:id="@+id/ll_back"
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_weight="1">
            <ImageView
                android:layout_marginLeft="16dp"
                android:layout_gravity="center"
                android:layout_width="20dp"
                android:layout_height="20dp"
                android:src="@drawable/icon_back"
                android:scaleType="fitXY"/>
        </LinearLayout>


        <TextView
            android:gravity="center"
            android:id="@+id/tv_title"
            android:layout_weight="3"
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:textColor="#CC000000"
            android:text="选择目标添加到挂件"
            android:textSize="16dp"
            android:textStyle="bold"/>

        <LinearLayout
            android:id="@+id/ll_select_all"
            android:gravity="right"
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_weight="1"
            android:orientation="horizontal">
            <ImageView
                android:layout_gravity="center"
                android:layout_width="20dp"
                android:layout_height="20dp"
                android:src="@drawable/select_all"
                android:scaleType="fitXY"/>
            <TextView
                android:layout_marginRight="16dp"
                android:layout_gravity="center"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="全选"/>
        </LinearLayout>
    </LinearLayout>

    <ListView
        android:paddingTop="5dp"
        android:background="#FFF6F7FB"
        android:id="@+id/lv_pie"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1"
        android:dividerHeight="0dp"
        android:divider="@null"/>
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="56dp"
        android:gravity="center">
        <TextView
            android:id="@+id/tv_select_num"
            android:gravity="center"
            android:layout_marginHorizontal="16dp"
            android:background="@drawable/shap_button_bg"
            android:layout_width="match_parent"
            android:layout_height="44dp"
            android:textColor="#FFFFFF"
            android:textSize="16sp"
            android:text="添加 (4)"
            />
    </LinearLayout>

</LinearLayout>
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout android:layout_width="match_parent"
    android:layout_height="match_parent"
    xmlns:android="http://schemas.android.com/apk/res/android">
    <LinearLayout
        android:id="@+id/ll_book"
        android:background="@drawable/shap_shader"
        android:layout_width="match_parent"
        android:layout_height="60dp"
        android:layout_marginHorizontal="10dp"
        android:orientation="horizontal">
        <TextView
            android:gravity="center_vertical"
            android:id="@+id/tv_target_name"
            android:layout_width="0dp"
            android:layout_weight="1"
            android:layout_height="match_parent"
            android:layout_marginLeft="20dp"
            android:layout_gravity="center"
            android:text="小学 一年级 上册"
            android:textSize="16dp"/>
        <CheckBox
            android:layout_marginRight="10dp"
            android:id="@+id/cb_select"
            android:padding="4dp"
            android:layout_width="wrap_content"
            android:layout_height="match_parent"
            android:theme="@style/MyCheckBox"
            android:scaleX="0.7"
            android:scaleY="0.7"/>

    </LinearLayout>
</LinearLayout>

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要在Qt ListView中添加复选框并实现全选功能,需要执行以下步骤: 1. 创建一个自定义的QAbstractListModel或QStandardItemModel来作为数据模型。 2. 在数据模型中添加一个bool类型的属性来表示每个项目是否选中。 3. 在ListView的delegate中添加一个QCheckBox显示每个项目的选中状态。 4. 创建一个全选/取消全选按钮并连接到相应的槽函数。 5. 在槽函数中遍历所有项目并设置它们的选中状态。 以下是一个示例代码: ``` // 自定义数据模型 class MyModel : public QAbstractListModel { public: struct Item { QString name; bool selected; }; MyModel(QObject *parent = nullptr) : QAbstractListModel(parent) {} int rowCount(const QModelIndex &parent = QModelIndex()) const override { return m_items.count(); } QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override { if (!index.isValid() || index.row() >= m_items.count()) return QVariant(); if (role == Qt::DisplayRole || role == Qt::EditRole) return m_items.at(index.row()).name; if (role == Qt::CheckStateRole) return m_items.at(index.row()).selected ? Qt::Checked : Qt::Unchecked; return QVariant(); } Qt::ItemFlags flags(const QModelIndex &index) const override { if (!index.isValid() || index.row() >= m_items.count()) return Qt::NoItemFlags; return Qt::ItemIsEnabled | Qt::ItemIsSelectable | Qt::ItemIsEditable | Qt::ItemIsUserCheckable; } bool setData(const QModelIndex &index, const QVariant &value, int role = Qt::EditRole) override { if (!index.isValid() || index.row() >= m_items.count()) return false; if (role == Qt::CheckStateRole) { m_items[index.row()].selected = value.toBool(); emit dataChanged(index, index, {role}); return true; } if (role == Qt::EditRole) { m_items[index.row()].name = value.toString(); emit dataChanged(index, index, {role}); return true; } return false; } QList<Item> items() const { return m_items; } void setItems(const QList<Item> &items) { beginResetModel(); m_items = items; endResetModel(); } void selectAll(bool selected) { for (int i = 0; i < m_items.count(); ++i) { if (m_items[i].selected != selected) { m_items[i].selected = selected; emit dataChanged(index(i), index(i), {Qt::CheckStateRole}); } } } private: QList<Item> m_items; }; // ListView的delegate class MyDelegate : public QStyledItemDelegate { public: MyDelegate(QObject *parent = nullptr) : QStyledItemDelegate(parent) {} QWidget *createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const override { QCheckBox *checkBox = new QCheckBox(parent); checkBox->setCheckState(index.data(Qt::CheckStateRole).toBool() ? Qt::Checked : Qt::Unchecked); return checkBox; } void setEditorData(QWidget *editor, const QModelIndex &index) const override { QCheckBox *checkBox = qobject_cast<QCheckBox *>(editor); checkBox->setCheckState(index.data(Qt::CheckStateRole).toBool() ? Qt::Checked : Qt::Unchecked); } void setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const override { QCheckBox *checkBox = qobject_cast<QCheckBox *>(editor); model->setData(index, checkBox->isChecked(), Qt::CheckStateRole); } }; // MainWindow中的代码 MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow) { ui->setupUi(this); // 创建数据模型并设置ListView的model和delegate m_model = new MyModel(this); ui->listView->setModel(m_model); ui->listView->setItemDelegate(new MyDelegate(this)); // 添加测试数据 QList<MyModel::Item> items; items.append({"Item 1", false}); items.append({"Item 2", false}); items.append({"Item 3", false}); items.append({"Item 4", false}); m_model->setItems(items); // 创建全选/取消全选按钮并连接到槽函数 QPushButton *selectAllButton = new QPushButton("Select All", this); ui->mainToolBar->addWidget(selectAllButton); connect(selectAllButton, &QPushButton::clicked, this, &MainWindow::onSelectAllClicked); } void MainWindow::onSelectAllClicked() { m_model->selectAll(true); } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值