当前位置: 首页 > news >正文

Android 自定义 Dialog 实现列表 单选,多选,搜索

前言

在Android开发中,通过对话框让用户选择,筛选信息是很方便也很常见的操作。本文详细介绍了如何使用自定义 Dialog、RecyclerView 以及自定义搜索框 来实现选中状态和用户交互,文中大本分代码都有明确注释,主打一个简单明了,实际效果如下,可单选,全选,精准查找,选择状态变化,以及信息回调


一、Builder 模式

说到自定义 Dialog,就不得不提到 Builder模式,

Android系统中的Builder设计模式是一种创建型设计模式,它主要用于构建一个复杂对象,并将其构建过程与表示分离,Builder设计模式通过将一个复杂对象的构建过程拆解成一系列简单的步骤,使得构建过程更加灵活、可读和易于扩展。它允许用户在不知道内部构建细节的情况下,可以更精细地控制对象的构造流程。

在Android开发中,Builder模式的一个常见应用是AlertDialog.Builder。AlertDialog是一个复杂的对话框对象,它包含多个属性和方法。使用AlertDialog.Builder可以方便地构建和显示对话框,而无需直接操作AlertDialog对象。例如:

AlertDialog.Builder builder = new AlertDialog.Builder(context);  
builder.setIcon(R.drawable.icon);  
builder.setTitle("头部");  
builder.setMessage("内容");  
builder.setPositiveButton("Button1", new DialogInterface.OnClickListener() {  public void onClick(DialogInterface dialog, int whichButton) {  // 处理点击事件  }  
});  
builder.create().show(); // 构建并显示对话框

综上所述,Builder设计模式在Android开发中具有重要的应用价值。它可以帮助开发者构建复杂对象,提高代码的可读性和可维护性,同时支持灵活的构建过程和对象变种。

二、使用步骤

1. 自定义 SerachSelectDialog

public class SerachSelectDialog extends Dialog {private static SearchSelectAdapter sa;private static String result;private static List<String> resultList = new ArrayList<>();private static List<String> selectedItems;private static int searchPosition;public SerachSelectDialog(Context context, int themeResId) {super(context, themeResId);}/*** 设置 Dialog的大小** @param x 宽比例* @param y 高比例*/public void setDialogWindowAttr(double x, double y, Activity activity) {if (x < 0 || x > 1 || y < 0 || y > 1) {return;}Window window = this.getWindow();WindowManager.LayoutParams lp = window.getAttributes();WindowManager manager = activity.getWindowManager();DisplayMetrics outMetrics = new DisplayMetrics();manager.getDefaultDisplay().getMetrics(outMetrics);int width = outMetrics.widthPixels;int height = outMetrics.heightPixels;lp.gravity = Gravity.BOTTOM;lp.width = (int) (width * x);lp.height = (int) (height * y);this.getWindow().setAttributes(lp);}public static class Builder {private String title;private View contentView;private String positiveButtonText;private String negativeButtonText;private List<ItemModel> listData;private View.OnClickListener positiveButtonClickListener;private View.OnClickListener negativeButtonClickListener;private View.OnClickListener singleButtonClickListener;private View layout;private Context context;private SerachSelectDialog dialog;private OnSelectedListiner selectedListiner;SearchView searchView;LinearLayout closeBtn;LinearLayout okBtn;TextView titleView;private boolean state = false;private RecyclerView itemLv;private final TextView qxTv;//初始化public Builder(Context context) {//这里传入自定义的style,直接影响此Dialog的显示效果。style具体实现见style.xmlthis.context = context;dialog = new SerachSelectDialog(context, R.style.selectDialog);LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);layout = inflater.inflate(R.layout.dialog_select_search, null);qxTv = layout.findViewById(R.id.qx_tv);itemLv = layout.findViewById(R.id.item_lv);searchView = layout.findViewById(R.id.searchView);closeBtn = layout.findViewById(R.id.diss_layout);okBtn = layout.findViewById(R.id.ok_layout);titleView = layout.findViewById(R.id.title_tv);dialog.addContentView(layout, new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT));}public Builder setTitle(String title) {this.title = title;return this;}public void setListData(List<ItemModel> listData) {this.listData = listData;}/*** 单按钮对话框和双按钮对话框的公共部分在这里设置*/private SerachSelectDialog create() {GridLayoutManager gridLayoutManager = new GridLayoutManager(context, 3);sa = new SearchSelectAdapter(listData);itemLv.setLayoutManager(gridLayoutManager);itemLv.setAdapter(sa);//搜索事件searchView.setSearchViewListener(new SearchView.onSearchViewListener() {@Overridepublic boolean onQueryTextChange(String text) {updateLayout(searchItem(text));return false;}});//全选qxTv.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {if (sa.getSelectedItemPositions().size() == sa.getItemCount()) {sa.clearSelection();} else {sa.selectAll();resultList = sa.getSelectedItems();}}});//取消按钮closeBtn.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {dialog.dismiss();resultList.clear();}});//确认按钮okBtn.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {String json = new Gson().toJson(resultList);selectedListiner.onSelected(json);dialog.dismiss();resultList.clear();}});dialog.setOnDismissListener(new OnDismissListener() {@Overridepublic void onDismiss(DialogInterface dialog) {}});//item点击事件sa.setOnItemClickListener(new SearchSelectAdapter.OnItemClickListener() {@Overridepublic void onItemClick(int position) {boolean selected = listData.get(position).isSelected();result = listData.get(position).getItemName();if (selected == true) {resultList.add(result);} else {resultList.remove(result);}Log.i("U--", resultList.toString() + selected + "");}});dialog.setContentView(layout);//用户可以点击手机Back键取消对话框显示dialog.setCancelable(true);//用户不能通过点击对话框之外的地方取消对话框显示dialog.setCanceledOnTouchOutside(false);return dialog;}//在数据源中查找匹配的数据public List<ItemModel> searchItem(String name) {ArrayList<ItemModel> mSearchList = new ArrayList<ItemModel>();for (int i = 0; i < listData.size(); i++) {int index = listData.get(i).getItemName().indexOf(name);// 存在匹配的数据if (index != -1) {mSearchList.add(listData.get(i));Log.i("U--", i + "搜索位置");searchPosition = i;}}return mSearchList;}//提供匹配后的的数据进行数据回调public void updateLayout(List<ItemModel> newList) {final SearchSelectAdapter sa = new SearchSelectAdapter(newList);GridLayoutManager gridLayoutManager = new GridLayoutManager(context, 3);itemLv.setLayoutManager(gridLayoutManager);itemLv.setAdapter(sa);//item点击事件sa.setOnItemClickListener(new SearchSelectAdapter.OnItemClickListener() {@Overridepublic void onItemClick(int position) {result = newList.get(position).getItemName();boolean selected = listData.get(searchPosition).isSelected();if (selected == true) {resultList.add(result);} else {resultList.remove(result);}Log.i("U--", resultList.toString() + selected + "");}});}//自定义接口进行数据点击回传public static abstract class OnSelectedListiner {public abstract void onSelected(String String);}public void setSelectedListiner(SerachSelectDialog.Builder.OnSelectedListiner selectedListiner) {this.selectedListiner = selectedListiner;}//弹框展示public SerachSelectDialog show() {create();dialog.show();return dialog;}}
}

2.自定义搜索框 SearchView

UI 主要包括输入框,删除键 ,主要通过监听EditText 的文本以及输入框的变化,设置搜索回调接口来实现

public class SearchView extends LinearLayout implements View.OnClickListener {/*** 输入框*/private EditText etInput;/*** 删除键*/private ImageView ivDelete;/*** 上下文对象*/private Context mContext;/*** 搜索回调接口*/private onSearchViewListener mListener;/*** 设置搜索回调接口** @param listener 监听者*/public void setSearchViewListener(onSearchViewListener listener) {mListener = listener;}public SearchView(Context context, AttributeSet attrs) {super(context, attrs);mContext = context;LayoutInflater.from(context).inflate(R.layout.view_search_layout, this);initViews();}private void initViews() {etInput = (EditText) findViewById(R.id.et_search_text);ivDelete = (ImageView) findViewById(R.id.imb_search_clear);ivDelete.setOnClickListener(this);etInput.addTextChangedListener(new EditChangedListener());etInput.setOnClickListener(this);}private class EditChangedListener implements TextWatcher {@Overridepublic void beforeTextChanged(CharSequence charSequence, int i, int i2, int i3) {}@Overridepublic void onTextChanged(CharSequence charSequence, int i, int i2, int i3) {if (!"".equals(charSequence.toString())) {ivDelete.setVisibility(VISIBLE);//更新autoComplete数据if (mListener != null) {mListener.onQueryTextChange(charSequence + "");}} else {ivDelete.setVisibility(GONE);}}@Overridepublic void afterTextChanged(Editable editable) {}}@Overridepublic void onClick(View view) {switch (view.getId()) {case R.id.imb_search_clear:etInput.setText("");if (mListener != null) {mListener.onQueryTextChange("");}ivDelete.setVisibility(GONE);break;}}/*** search view回调方法*/public interface onSearchViewListener {boolean onQueryTextChange(String text);}
}  

3.SearchSelectAdapter

主要实现条目的点击事件以及数据回调

public class SearchSelectAdapter extends RecyclerView.Adapter<SearchSelectAdapter.ViewHolder> {private List<ItemModel> itemList;private List<Integer> selectedItemPositions;//声明接口private OnItemClickListener onItemClickListener;public SearchSelectAdapter(List<ItemModel> itemList) {this.itemList = itemList;selectedItemPositions = new ArrayList<>();}@Overridepublic int getItemCount() {return itemList.size();}public void setOnItemClickListener(OnItemClickListener listener) {this.onItemClickListener = listener;}@NonNull@Overridepublic ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {// 创建ViewHolderView view = LayoutInflater.from(parent.getContext()).inflate(R.layout.list_cell_select_single, parent, false);return new ViewHolder(view);}@Overridepublic void onBindViewHolder(@NonNull ViewHolder holder, int position) {// 绑定数据到ViewHolderItemModel item = itemList.get(position);holder.textView.setText(item.getItemName());//给条目布局设置点击事件holder.itemLayout.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {if (selectedItemPositions.contains(position)) {selectedItemPositions.remove(Integer.valueOf(position));holder.textView.setTextColor(Color.BLACK);holder.itemView.setBackgroundResource(R.drawable.item_grey_layout_bg);item.setSelected(false);} else {selectedItemPositions.add(position);holder.textView.setTextColor(Color.WHITE);holder.itemView.setBackgroundResource(R.drawable.item_blue_layout_bg);item.setSelected(true);}if (onItemClickListener != null) {onItemClickListener.onItemClick(position);}}});if (selectedItemPositions.contains(position)) {holder.textView.setTextColor(Color.WHITE);holder.itemView.setBackgroundResource(R.drawable.item_blue_layout_bg);} else {holder.textView.setTextColor(Color.BLACK);holder.itemView.setBackgroundResource(R.drawable.item_grey_layout_bg);}}/*** 接口回调*/public interface OnItemClickListener {void onItemClick(int position);}public void selectAll() {selectedItemPositions.clear();for (int i = 0; i < itemList.size(); i++) {selectedItemPositions.add(i);}notifyDataSetChanged();}public void clearSelection() {selectedItemPositions.clear();notifyDataSetChanged();}public List<Integer> getSelectedItemPositions() {return selectedItemPositions;}public List<String> getSelectedItems() {List<String> selectedItems = new ArrayList<>();for (int position : selectedItemPositions) {selectedItems.add(itemList.get(position).getItemName());}return selectedItems;}public static class ViewHolder extends RecyclerView.ViewHolder {private final TextView textView;private final LinearLayout itemLayout;public ViewHolder(@NonNull View itemView) {super(itemView);textView = itemView.findViewById(R.id.tv_select_info);itemLayout = itemView.findViewById(R.id.item_layout);}}
}

4.xml 布局

dialog_select_search.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="match_parent"android:orientation="vertical"><LinearLayoutandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:background="@drawable/item_white_layout"android:orientation="vertical"><RelativeLayoutandroid:layout_width="match_parent"android:layout_height="50dp"><TextViewandroid:id="@+id/title_tv"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_centerInParent="true"android:text="岗位选择"android:textColor="@color/black" /></RelativeLayout><com.example.dialoglistview.SearchViewandroid:id="@+id/searchView"android:layout_width="match_parent"android:layout_height="wrap_content" /><TextViewandroid:id="@+id/qx_tv"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_marginLeft="20dp"android:layout_marginTop="@dimen/dp_10"android:text="全选"android:textSize="16sp" /><androidx.recyclerview.widget.RecyclerViewandroid:id="@+id/item_lv"android:layout_width="match_parent"android:layout_height="wrap_content" /><Viewandroid:layout_width="match_parent"android:layout_height="1dp"android:background="@color/grey" /><LinearLayoutandroid:layout_width="match_parent"android:layout_height="40dp"android:background="@color/transparent"android:gravity="center"android:orientation="horizontal"><LinearLayoutandroid:id="@+id/diss_layout"android:layout_width="0dp"android:layout_height="match_parent"android:layout_weight="1"android:gravity="center"><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:text="取消"android:textColor="@color/sea_blue" /></LinearLayout><Viewandroid:layout_width="1dp"android:layout_height="match_parent"android:background="@color/grey" /><LinearLayoutandroid:id="@+id/ok_layout"android:layout_width="0dp"android:layout_height="match_parent"android:layout_weight="1"android:gravity="center"><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:text="确定"android:textColor="@color/sea_blue" /></LinearLayout></LinearLayout></LinearLayout></LinearLayout>

view_search_layout.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="50dp"android:background="#ffffff"android:gravity="center"android:orientation="vertical"><LinearLayoutandroid:layout_width="match_parent"android:layout_height="35dp"android:layout_marginLeft="15dp"android:layout_marginRight="15dp"android:background="@drawable/item_search_layout"android:gravity="center_vertical"android:orientation="horizontal"><ImageButtonandroid:id="@+id/imb_search_search"android:layout_width="20dp"android:layout_height="20dp"android:layout_marginLeft="15dp"android:background="#F0F0F0"android:scaleType="centerInside"android:src="@mipmap/im_search_back" /><EditTextandroid:id="@+id/et_search_text"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginLeft="10dp"android:layout_marginRight="15dp"android:layout_weight="1"android:background="@null"android:hint="请输入搜索内容"android:lines="1"android:textSize="14sp" /><ImageButtonandroid:id="@+id/imb_search_clear"android:layout_width="35dp"android:layout_height="35dp"android:layout_marginRight="20dp"android:background="#F0F0F0"android:padding="12.5dp"android:scaleType="centerInside"android:src="@mipmap/delet_zhaopian_1x"android:visibility="gone" /></LinearLayout></LinearLayout>

5.数据支持

// 创建数据列表
itemList = new ArrayList<>();
itemList.add(new ItemModel("医生", false));
itemList.add(new ItemModel("警察", false));
itemList.add(new ItemModel("护士", false));
itemList.add(new ItemModel("农民", false));
itemList.add(new ItemModel("工人", false));
itemList.add(new ItemModel("司机", false));

public class ItemModel {private String itemName;private boolean isSelected;public ItemModel(String itemName, boolean isSelected) {this.itemName = itemName;this.isSelected = isSelected;}public String getItemName() {return itemName;}public void setItemName(String itemName) {this.itemName = itemName;}public boolean isSelected() {return isSelected;}public void setSelected(boolean selected) {isSelected = selected;}
}

6.实际应用

    private void openSearchSelectDialog() {SerachSelectDialog.Builder alert = new SerachSelectDialog.Builder(this);alert.setListData(itemList);alert.setTitle("岗位选择");alert.setSelectedListiner(new SerachSelectDialog.Builder.OnSelectedListiner() {@Overridepublic void onSelected(String info) {okTv.setText(info);}});SerachSelectDialog mDialog = alert.show();//设置Dialog 尺寸mDialog.setDialogWindowAttr(0.9, 0.9, this);}

三、总结

后续 Demo 会上传

如果对你有所帮助的话,不妨 点赞收藏
如果你有什么疑问的话,不妨 评论私信
青山不改,绿水长流 ,有缘江湖再见 ~

相关文章:

Android 自定义 Dialog 实现列表 单选,多选,搜索

前言 在Android开发中&#xff0c;通过对话框让用户选择&#xff0c;筛选信息是很方便也很常见的操作。本文详细介绍了如何使用自定义 Dialog、RecyclerView 以及自定义搜索框 来实现选中状态和用户交互&#xff0c;文中大本分代码都有明确注释&#xff0c;主打一个简单明了&a…...

下载地址合辑(持续更新)

下载地址合辑 汇总OSG相关地址Visual Studio Qt 地址qt插件安装失败 Boost库boost库编译步骤 FFmpeg 地址osg编译库 常用的下载地址&#xff1a; 汇总 vlc 地址&#xff1a; https://www.videolan.org/vlc/index.zh_CN.html visual 地址&#xff1a;https://my.visualstudio.…...

Android Kotlin 高阶函数详解及其在协程中的应用

文章目录 1. 引言2. 什么是高阶函数&#xff1f;3. 高阶函数的基础用法3.1 传递函数作为参数3.2 Lambda 表达式3.3 匿名函数3.4 返回函数 4. 高阶函数的深入用法4.1 函数组合4.2 内联函数4.3 高阶扩展函数 5. Kotlin 高阶函数的对比优势5.1 与 Java 的对比5.2 与 JavaScript 的…...

CSS基础—网页布局(重点!)

1、两列布局 &#xff08;1&#xff09;概念 经典两列布局是指一种网页布局方式&#xff0c;其中一列宽度固定&#xff0c;另一列宽度自适应。‌ 这种布局方式在网页设计中非常常见&#xff0c;因为它能够提供良好的视觉效果和用户体验。 如图所示&#xff1a; 页面顶部放置一…...

【Fargo】17:vs工程转qt构建:QT6 不支持32bit转向qt5.15.2

vs2022的console 工程加入qt支持后使用qt15.2 的vs2019 库,变为一个qt界面程序。最终效果 一些参考 qt5的项目搭建 qt5 最多支持到vs2019 qt6 最新 已经支持vs2022 国内还是以qt5.15为主 升级qt的vstools...

​智能电表蓝牙芯片方案

RAMSUN基于自研射频技术和基带算法提供蓝牙MCU。蓝牙MCU配套成熟的网络协议栈和丰富的示例代码及多平台APP工具。部分芯片型号无需二次开发&#xff0c;即连即用&#xff1b;提供特色蓝牙/串口/USB三通芯片&#xff0c;为更多复杂无线应用赋能。 应用案例说明: BLE方便用户直接…...

miRNA分析流程学习(一)/TCGAmiRNA数据下载

miRNA&#xff08;microRNA&#xff09; 是一种小的非编码 RNA 分子&#xff0c;通常由 20 到 24 个核苷酸组成。miRNA 主要存在于动植物中&#xff0c;并在基因表达调控中起到关键作用。它们通过与特定的信使 RNA&#xff08;mRNA&#xff09;分子结合来抑制基因表达&#xff…...

西南大学软件专硕考研难度分析!

C哥专业提供——计软考研院校选择分析专业课备考指南规划 西南大学软件工程学硕近三年呈现出招生规模稳定、复试线稳中有升的特点。2024届实际录取8人&#xff0c;复试分数线305分&#xff0c;复试录取率67%&#xff0c;相比去年复试线略有下降但仍高于2022届&#xff0c;显示出…...

计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-10-21

计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-10-21 目录 文章目录 计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-10-21目录1. The Fair Language Model Paradox摘要研究背景问题与挑战如何解决创新点算法模型实验效果重要数据与结论推荐阅读指数&…...

安全芯片 OPTIGA TRUST M 使用介绍与示例(基于STM32裸机)

文章目录 目的资料索引硬件电路软件框架介绍数据存储框架移植框架使用 使用示例示例地址与硬件连接通讯测试功能测试 总结 目的 OPTIGA TRUST M 是英飞凌推出的安全芯片&#xff0c;芯片通提供了很多 slot &#xff0c;用于存放各类安全证书、密钥、用户数据等&#xff0c;内置…...

【AI换装整合及教程】CatVTON:时尚与科技的完美融合

在当今数字化时代&#xff0c;时尚行业正经历着一场前所未有的变革&#xff0c;而 CatVTON 作为一款由中山大学、Pixocial 等机构联合研发的轻量化 AI 虚拟换装工具&#xff0c;无疑是这场变革中的璀璨明星。 一、独特的技术架构 CatVTON 基于 Stable Diffusion v1.5 inpainit…...

接口测试(七)jmeter——参数化(RandomString函数)

一、RandomString函数 需求&#xff1a;模拟10个用户注册 1. 【工具】–>【函数助手对话框】 2. 选择RandomString函数 假设手机号码前3位设置为固定数值136&#xff0c;后8位可用RandomString函数随机产生数值 ① Random string length&#xff1a;8&#xff08;随机长度…...

simple_php

访问靶场 这里传入a和b参数&#xff0c;绕过三个if即可拿到flag a a a_GET[ a’ ];中是抑制报错信息的。 第一个if非常的抽象&#xff0c; if($a0 and $a){echo $flag1; }处理a 要输出flag1,a0&#xff0c;但是&#xff0c;在php中0被视为假也就是Flase 如果a0&#xff0…...

网络搜索引擎Shodan(4)

声明&#xff1a;学习视频来自b站up主 泷羽sec&#xff0c;如涉及侵权马上删除文章 声明&#xff1a;本文主要用作技术分享&#xff0c;所有内容仅供参考。任何使用或依赖于本文信息所造成的法律后果均与本人无关。请读者自行判断风险&#xff0c;并遵循相关法律法规。 感谢泷…...

【Flask】一、安装与第一个测试程序

目录 Flask简介 安装Flask 安装pip&#xff08;Python包管理器&#xff09; 使用pip安装Flask 验证安装 创建Flask程序 创建应用 运行 访问测试 Flask简介 Flask是一个用Python编写的轻量级Web应用框架。它被设计为易于使用和扩展&#xff0c;使其成为构建简单网站或复…...

R语言笔记(二):向量

文章目录 一、Data structure: vectors二、Indexing vectors三、Re-assign values to vector elements四、Generic function for vectors五、Vector of random samples from a distribution六、Vector arithmetic七、Recycling八、Element-wise comparisons of vectors九、Comp…...

信息安全工程师(71)隐私保护技术与应用

前言 隐私保护技术是指通过一系列的技术手段来保护人们的隐私不被公开泄露。随着数字化和网络化社会的发展&#xff0c;个人隐私的保护变得尤为重要&#xff0c;隐私保护技术也因此得到了广泛的应用和发展。 一、隐私保护技术概述 隐私保护技术主要包括数据加密技术、身份认证技…...

层和块学习

1.生成一个网络&#xff0c;其中包含一个具有256个单元和ReLU激活函数的全连接隐藏层&#xff0c;然后是一个具有10个隐藏单元且不带激活函数的全连接输出层。 import torch from torch import nn from torch.nn import functional as Fnet nn.Sequential(nn.Linear(20, 256)…...

Zookeeper面试整理-源码及实现细节

Zookeeper 的源码和实现细节是理解其高可用性、分布式一致性和高效性的关键。以下是 Zookeeper 的核心实现细节,涵盖其架构、关键模块、以及具体的代码实现机制。 1. Zookeeper 架构 Zookeeper 采用 Leader-Follower 架构,集群由多个节点组成。主要分为三种角色:Leader、Fol…...

岭回归的MATLAB步骤

MATLAB 实现框架&#xff0c;它涵盖了从数据导入到岭回归的步骤&#xff0c;包括计算共线性、使用 MAE、MSE、R、MAPE 进行评价&#xff0c;以及绘制相应的可视化图表。 1. 数据导入 首先&#xff0c;导入你的 Excel 文件 data.xlsx。假设前面的列是因变量&#xff08;特征&a…...

C++:std::is_convertible

C++标志库中提供is_convertible,可以测试一种类型是否可以转换为另一只类型: template <class From, class To> struct is_convertible; 使用举例: #include <iostream> #include <string>using namespace std;struct A { }; struct B : A { };int main…...

.Net框架,除了EF还有很多很多......

文章目录 1. 引言2. Dapper2.1 概述与设计原理2.2 核心功能与代码示例基本查询多映射查询存储过程调用 2.3 性能优化原理2.4 适用场景 3. NHibernate3.1 概述与架构设计3.2 映射配置示例Fluent映射XML映射 3.3 查询示例HQL查询Criteria APILINQ提供程序 3.4 高级特性3.5 适用场…...

Leetcode 3577. Count the Number of Computer Unlocking Permutations

Leetcode 3577. Count the Number of Computer Unlocking Permutations 1. 解题思路2. 代码实现 题目链接&#xff1a;3577. Count the Number of Computer Unlocking Permutations 1. 解题思路 这一题其实就是一个脑筋急转弯&#xff0c;要想要能够将所有的电脑解锁&#x…...

Linux简单的操作

ls ls 查看当前目录 ll 查看详细内容 ls -a 查看所有的内容 ls --help 查看方法文档 pwd pwd 查看当前路径 cd cd 转路径 cd .. 转上一级路径 cd 名 转换路径 …...

什么是库存周转?如何用进销存系统提高库存周转率?

你可能听说过这样一句话&#xff1a; “利润不是赚出来的&#xff0c;是管出来的。” 尤其是在制造业、批发零售、电商这类“货堆成山”的行业&#xff0c;很多企业看着销售不错&#xff0c;账上却没钱、利润也不见了&#xff0c;一翻库存才发现&#xff1a; 一堆卖不动的旧货…...

Frozen-Flask :将 Flask 应用“冻结”为静态文件

Frozen-Flask 是一个用于将 Flask 应用“冻结”为静态文件的 Python 扩展。它的核心用途是&#xff1a;将一个 Flask Web 应用生成成纯静态 HTML 文件&#xff0c;从而可以部署到静态网站托管服务上&#xff0c;如 GitHub Pages、Netlify 或任何支持静态文件的网站服务器。 &am…...

【配置 YOLOX 用于按目录分类的图片数据集】

现在的图标点选越来越多&#xff0c;如何一步解决&#xff0c;采用 YOLOX 目标检测模式则可以轻松解决 要在 YOLOX 中使用按目录分类的图片数据集&#xff08;每个目录代表一个类别&#xff0c;目录下是该类别的所有图片&#xff09;&#xff0c;你需要进行以下配置步骤&#x…...

Python如何给视频添加音频和字幕

在Python中&#xff0c;给视频添加音频和字幕可以使用电影文件处理库MoviePy和字幕处理库Subtitles。下面将详细介绍如何使用这些库来实现视频的音频和字幕添加&#xff0c;包括必要的代码示例和详细解释。 环境准备 在开始之前&#xff0c;需要安装以下Python库&#xff1a;…...

浅谈不同二分算法的查找情况

二分算法原理比较简单&#xff0c;但是实际的算法模板却有很多&#xff0c;这一切都源于二分查找问题中的复杂情况和二分算法的边界处理&#xff0c;以下是博主对一些二分算法查找的情况分析。 需要说明的是&#xff0c;以下二分算法都是基于有序序列为升序有序的情况&#xf…...

Unity | AmplifyShaderEditor插件基础(第七集:平面波动shader)

目录 一、&#x1f44b;&#x1f3fb;前言 二、&#x1f608;sinx波动的基本原理 三、&#x1f608;波动起来 1.sinx节点介绍 2.vertexPosition 3.集成Vector3 a.节点Append b.连起来 4.波动起来 a.波动的原理 b.时间节点 c.sinx的处理 四、&#x1f30a;波动优化…...