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开发中,通过对话框让用户选择,筛选信息是很方便也很常见的操作。本文详细介绍了如何使用自定义 Dialog、RecyclerView 以及自定义搜索框 来实现选中状态和用户交互,文中大本分代码都有明确注释,主打一个简单明了&a…...
下载地址合辑(持续更新)
下载地址合辑 汇总OSG相关地址Visual Studio Qt 地址qt插件安装失败 Boost库boost库编译步骤 FFmpeg 地址osg编译库 常用的下载地址: 汇总 vlc 地址: https://www.videolan.org/vlc/index.zh_CN.html visual 地址:https://my.visualstudio.…...
Android Kotlin 高阶函数详解及其在协程中的应用
文章目录 1. 引言2. 什么是高阶函数?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、两列布局 (1)概念 经典两列布局是指一种网页布局方式,其中一列宽度固定,另一列宽度自适应。 这种布局方式在网页设计中非常常见,因为它能够提供良好的视觉效果和用户体验。 如图所示: 页面顶部放置一…...
【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工具。部分芯片型号无需二次开发,即连即用;提供特色蓝牙/串口/USB三通芯片,为更多复杂无线应用赋能。 应用案例说明: BLE方便用户直接…...
miRNA分析流程学习(一)/TCGAmiRNA数据下载
miRNA(microRNA) 是一种小的非编码 RNA 分子,通常由 20 到 24 个核苷酸组成。miRNA 主要存在于动植物中,并在基因表达调控中起到关键作用。它们通过与特定的信使 RNA(mRNA)分子结合来抑制基因表达ÿ…...
西南大学软件专硕考研难度分析!
C哥专业提供——计软考研院校选择分析专业课备考指南规划 西南大学软件工程学硕近三年呈现出招生规模稳定、复试线稳中有升的特点。2024届实际录取8人,复试分数线305分,复试录取率67%,相比去年复试线略有下降但仍高于2022届,显示出…...
计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-10-21
计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-10-21 目录 文章目录 计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-10-21目录1. The Fair Language Model Paradox摘要研究背景问题与挑战如何解决创新点算法模型实验效果重要数据与结论推荐阅读指数&…...
安全芯片 OPTIGA TRUST M 使用介绍与示例(基于STM32裸机)
文章目录 目的资料索引硬件电路软件框架介绍数据存储框架移植框架使用 使用示例示例地址与硬件连接通讯测试功能测试 总结 目的 OPTIGA TRUST M 是英飞凌推出的安全芯片,芯片通提供了很多 slot ,用于存放各类安全证书、密钥、用户数据等,内置…...
【AI换装整合及教程】CatVTON:时尚与科技的完美融合
在当今数字化时代,时尚行业正经历着一场前所未有的变革,而 CatVTON 作为一款由中山大学、Pixocial 等机构联合研发的轻量化 AI 虚拟换装工具,无疑是这场变革中的璀璨明星。 一、独特的技术架构 CatVTON 基于 Stable Diffusion v1.5 inpainit…...
接口测试(七)jmeter——参数化(RandomString函数)
一、RandomString函数 需求:模拟10个用户注册 1. 【工具】–>【函数助手对话框】 2. 选择RandomString函数 假设手机号码前3位设置为固定数值136,后8位可用RandomString函数随机产生数值 ① Random string length:8(随机长度…...
simple_php
访问靶场 这里传入a和b参数,绕过三个if即可拿到flag a a a_GET[ a’ ];中是抑制报错信息的。 第一个if非常的抽象, if($a0 and $a){echo $flag1; }处理a 要输出flag1,a0,但是,在php中0被视为假也就是Flase 如果a0࿰…...
网络搜索引擎Shodan(4)
声明:学习视频来自b站up主 泷羽sec,如涉及侵权马上删除文章 声明:本文主要用作技术分享,所有内容仅供参考。任何使用或依赖于本文信息所造成的法律后果均与本人无关。请读者自行判断风险,并遵循相关法律法规。 感谢泷…...
【Flask】一、安装与第一个测试程序
目录 Flask简介 安装Flask 安装pip(Python包管理器) 使用pip安装Flask 验证安装 创建Flask程序 创建应用 运行 访问测试 Flask简介 Flask是一个用Python编写的轻量级Web应用框架。它被设计为易于使用和扩展,使其成为构建简单网站或复…...
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)隐私保护技术与应用
前言 隐私保护技术是指通过一系列的技术手段来保护人们的隐私不被公开泄露。随着数字化和网络化社会的发展,个人隐私的保护变得尤为重要,隐私保护技术也因此得到了广泛的应用和发展。 一、隐私保护技术概述 隐私保护技术主要包括数据加密技术、身份认证技…...
层和块学习
1.生成一个网络,其中包含一个具有256个单元和ReLU激活函数的全连接隐藏层,然后是一个具有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 实现框架,它涵盖了从数据导入到岭回归的步骤,包括计算共线性、使用 MAE、MSE、R、MAPE 进行评价,以及绘制相应的可视化图表。 1. 数据导入 首先,导入你的 Excel 文件 data.xlsx。假设前面的列是因变量(特征&a…...
智能指针(unique_ptr,shared_ptr,weak_ptr)
在实际的C开发中,我们经常会遇到诸如程序运行中突然崩溃,程序运行所用内存越来越多最终不得不重启等问题,这些问题往往都是内存资源管理不当造成的(内存泄漏) 比如: 有些内存资源已经被释放,但指向它的指针并没有改变指…...
Sql执行较慢的排查方式
SQL执行较慢的排查方式涉及多个方面,包括检查SQL语句本身、数据库配置、硬件资源等。以下是一些具体的排查步骤和优化建议: 一、检查SQL语句 启用慢查询日志: 大多数数据库管理系统(如MySQL、PostgreSQL)都支持慢查询…...
CesiumJS 案例 P6:添加图片图层、添加图片图层并覆盖指定区域
CesiumJS CesiumJS API:https://cesium.com/learn/cesiumjs/ref-doc/index.html CesiumJS 是一个开源的 JavaScript 库,它用于在网页中创建和控制 3D 地球仪(地图) 一、添加图片图层 <!DOCTYPE html> <html lang"…...
Python画笔案例-094 绘制 神奇彩条动画
1、绘制 神奇彩条动画 通过 python 的turtle 库绘制 神奇彩条动画,如下图: 2、实现代码 绘制 神奇彩条动画,以下为实现代码: """神奇彩条动画.py一个用海龟画图的图章功能配合颜色渐变和动画原理做成的动画。 """ from random import randi…...
javaScript整数反转
function _reverse(number) { // 补全代码 return (number ).split().reverse().join(); } number :首先,将数字 number 转换为字符串。在 JavaScript 中,当你将一个数字与一个字符串相加时,JavaScript 会自动将数字转换为字符串…...
Zookeeper面试整理-故障排查和调试
在使用 Zookeeper 的过程中,可能会遇到各种问题,如性能下降、节点失效、集群不可用等。为了保持系统的稳定性和高可用性,掌握 Zookeeper 的故障排查和调试方法至关重要。以下是一些常见的故障排查技巧和调试方法: 1. 日志分析 Zookeeper 的日志是最直接的调试和故障排查工具…...
PG数据库之索引详解
PostgreSQL数据库中的索引是一种用于提高查询性能的重要数据结构。通过索引,数据库可以快速定位到表中的特定行,而无需进行全表扫描。PostgreSQL支持多种索引类型,每种类型都有其特定的应用场景和性能特点。下面将详细介绍PostgreSQL中的索引…...
springboot项目测试环境构建出的依赖包比本地构建出的依赖包多
本地能够正常启动服务,但是测试环境启动报错。 上述druid是服务pom文件中之前引入的依赖包,后续由于某种原因而不需要该依赖包了,故已在pom文件中移除掉了该依赖包。 移除该依赖包之后,本地服务可正常构建和启动。 而测试环境却…...
温湿度传感器(学习笔记上)
在学习这个项目之前,我们先了解一下传感器,查阅资料可知,电路板上温湿度传感器型号是GXHTC3,是北京中科银河芯科技有限公司研发的一款芯片,采用I2C接口与ESP32-C3通信,I2C地址是0x70。 接下来我们要进行编写i2c驱动程序,首先我们复制esp-idf-v5.1.3\examples\get-started\samp…...
sv标准研读第十九章-功能覆盖率
书接上回: sv标准研读第十八章-随机化和约束 第19章 功能覆盖率 19.1 总览 -定义cover group -定义cover point -定义cross cover -cover选项 -cover系统函数和系统方法 -cover计算 19.2 概述 覆盖率广义上分为两种:功能覆盖率和工具可以自动…...
如何做自己个人网站/兰州seo技术优化排名公司
sprintf是格式化字符串最常用的方式。vsprintf可以很方便的使用va_list,对应的宽字符版本就是vswprintf。在跨平台上使用vswprintf,于是噩梦开始了。支持最好的当然是windows,一点问题都没有。mac/ios上如果是宽字节的英文字符则是正常的,如果…...
外贸b2c网站建设公司/深圳百度推广公司
对于一个对IT行业一知半解的人来讲,选择学哪一门编程语言真的很难,然而仔细分析人 为什么那么多人学Java?简单概括就是功力深厚,无人撼动。 首先,Java诞生于互联网蓬勃发展的时期,那时C语言一家独大&…...
响应式网站怎么写/网站推广要点
// socket已经连接成功 var socketOpen false // socket已经调用关闭function var socketClose false // socket发送的消息队列 var socketMsgQueue [] // 判断心跳变量 var heart // 心跳失败次数 var heartBeatFailCount 0 // 终止心跳 var heartBeatTimeOut null; //…...
上海网站建设穹拓/网络营销公司哪家好
归属之谷是由 The Sandbox 的 Game Maker 基金会支持的项目之一。了解更多关于 The Sandbox 元宇宙独有的令人难以置信的美丽和多元化的体验。 归属之谷是元宇宙中最多元化的体验之一。为所有不同背景及身份的人提供一个安全的地方。 The Sandbox 为可以成为骄傲、多元性以及身…...
博客社区类网站模板下载/网站怎么建立
本节知识点:Ionic之form表单实现MVVM,模拟数据提交或信息注册案例。 效果展示: 【ion-input】单行文本框 <ion-item-divider><ion-label>用户基本信息</ion-label></ion-item-divider><ion-item><ion-labe…...
苏州运营推广网站建设/电商推广平台
Qt学习杂记 【查看UI文件生成的对应代码】 自动生成的ui.h文件Qt 5.14 -> Qt Widgets 相关的API介绍自定义对象加上元属性:Q_OBJECT class MyButton : public QPushButton {Q_OBJECT public:MyButton(QString text, QWidget *parent):QPushButton(qmove(text), …...