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 会上传

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/456118.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

JS | 如何使用 JavaScript 实现图片懒加载的淡入效果?

在现代的网页设计中&#xff0c;为了提高用户体验和网站性能&#xff0c;图片懒加载已经成为一个常见的技术。图片懒加载可以减少初始加载时间&#xff0c;延迟加载图片直到用户滚动到它们所在的位置。另外&#xff0c;为了进一步提升用户体验&#xff0c;添加淡入效果可以使页…

【忍无可忍,无需再忍】永久解决xshell or xftp 更新问题

1 背景介绍 提示“要继续使用此程序,您必须应用最新的更新或使用新版本”&#xff0c;笔者版本是xshell 6 距离一段时间不使用&#xff0c;或者遇到更新场景&#xff0c;总是会弹出这个框&#xff0c;实在是忍无可忍&#xff0c;无需再忍。 2 思路介绍 笔者上一篇关于如何解…

学习的内核,如何更好的学习呢?

文章目录 三步学习法起因&#xff1a;三步学习法是什么&#xff1f;三步学习法为什么&#xff1f;我自己的实例 三步学习法应该怎么办&#xff1f;总结&#xff1a; 三步学习法 起因&#xff1a; 今天在学习黑马的java设计模式&#xff0c;我会觉得我的学习进度很慢&#xff0…

MAVlink协议 部分通用消息集解析

文章目录 MAVLink是一种非常轻量级的消息传输协议, 用于地面控制终端&#xff08;地面站&#xff09;与无人机之间 (以及机载无人机组件之间) 进行通信&#xff0c; 为一种设计用于资源受限系统及带宽受限链路的二进制遥测协议。 HEARTBEAT 检测信号消息显示系统或组件存在并正…

【32】C++流

C流 IO: 向设备输入数据和输出数据 C的IO流 设备: 文件控制台特定的数据类型(stringstream) c中,必须通过特定的已经定义好的类, 来处理IO(输入输出) 读写文件&#xff1a;文件流 文件流: 对文件进行读写操作 头文件: <fstream> 类库: ifstream 对文件输入&am…

C#基础知识-枚举

目录 枚举 1.分类 1.1普通枚举 1&#xff09;默认情况 2&#xff09;指定起始值 1.2标志枚举&#xff08;Flag Enum&#xff09; 位运算符与标志枚举 1&#xff09;组合标志 2&#xff09;检查标志 2.枚举与不同类型之间的转换 1&#xff09;枚举->整型 2&#…

深度学习调参大法

目录 trick 1&#xff1a;深度学习调参核心点trick 2&#xff1a;关于 深度学习Model选型问题trick 3&#xff1a;关于数据trick 4&#xff1a;关于调参 4.1 关于 Loss function 调参策略4.2 关于 Learning rate 和 batch size 调参策略4.3 关于 Epoch number 和 early stoppi…

数据结构模板代码合集(不完整)

P3368 【模板】树状数组 2 #include <bits/stdc.h> using namespace std; const int maxn 5e5 7;int n, m, s, t; int ans; int a[maxn]; struct node{int l, r;int num; }tr[maxn * 4];void build(int p, int l, int r){tr[p] {l, r, 0};if(l r){tr[p].num a[l];r…

TCP全连接队列与 tcpdump 抓包

&#x1f351;个人主页&#xff1a;Jupiter. &#x1f680; 所属专栏&#xff1a;计算机网络高效通关之路 欢迎大家点赞收藏评论&#x1f60a; 目录 listen第二个参数详解 全连接队列与半连接队列半开放连接队列&#xff08;SYN队列&#xff09;全连接队列&#xff08;接受队列…

【MySQL】C语言连接MySQL数据库3——事务操作和错误处理API

目录 1.MySQL事务处理机制 1.1.autocommit 1.2.autocommit的设置与查看 1.3.使用示例 2.事务操作API 2.1.设置事务提交模式——mysql_autocommit() 2.2.提交事务——mysql_commit() 2.3.事务回滚——mysql_rollback() 3.错误处理的API 3.1.返回错误的描述——mysql_er…

15.6 JDBC数据库编程6——可滚动和可更新的ResultSet

目录 15.6 引言 15.6.1 可滚动的ResultSet 15.6.1 可更新的ResultSet 15.6 引言 可滚动的ResultSet是指在结果集对象上不但可以向前访问结果集中的记录&#xff0c;还可以向后访问结果集中记录。可更新的ResultSet是指不但可以访问结果集中的记录&#xff0c;还可以更新…

关于移动硬盘复制文件0x80071AC3错误解决方法

一、问题详情 新入手的西部数据移动硬盘在复制文件到手机是没有问题的&#xff0c;但是在电脑复制文件的时候&#xff0c;电脑弹出0x80071AC3错误&#xff0c;没办法复制文件&#xff0c;也没办法新建文件夹。 二、原因 因为卷有问题&#xff0c;请运行chkdsk并重试。 三、解…

使用Vue.js构建响应式Web应用

&#x1f496; 博客主页&#xff1a;瑕疵的CSDN主页 &#x1f4bb; Gitee主页&#xff1a;瑕疵的gitee主页 &#x1f680; 文章专栏&#xff1a;《热点资讯》 使用Vue.js构建响应式Web应用 1 引言 2 Vue.js简介 3 安装Vue CLI 4 创建Vue项目 5 设计应用结构 6 创建组件 7 使用…

SLAM|1. 相机投影及相机畸变

一个能思考的人&#xff0c;才真是一个力量无边的人。——巴尔扎克 本章主要内容&#xff1a; 1.针孔相机模型 2.相机成像的几个坐标系图像 3.畸变及相机标定 本节主要介绍在照相机拍摄过程中&#xff0c;现实物体如何跟照片上的像素关联起来&#xff0c;具体涉及相机成像的物…

LabVIEW换流变换器智能巡检系统

基于LabVIEW的换流变换器智能巡检系统通过自动化检测和数据分析&#xff0c;提高换流变换器的运行效率和可靠性&#xff0c;降低人工维护成本。 项目背景&#xff1a; 换流变压器作为电力系统的重要组成部分&#xff0c;其性能的可靠性直接影响到整个电网的稳定运行。然而&…

Spring Boot:植物健康的智能守护者

2相关技术 2.1 MYSQL数据库 MySQL是一个真正的多用户、多线程SQL数据库服务器。 是基于SQL的客户/服务器模式的关系数据库管理系统&#xff0c;它的有点有有功能强大、使用简单、管理方便、安全可靠性高、运行速度快、多线程、跨平台性、完全网络化、稳定性等&#xff0c;非常…

Python基于amazon/chronos-t5-base的预训练模型离线对时间系列数据的未来进行预测

Python基于预训练模型对时间系列数据的未来进行预测 导入库 %matplotlib inline import matplotlib.pyplot as plt import numpy as np import pandas as pd import torch from chronos import ChronosPipeline from tqdm.auto import tqdm from autogluon.timeseries import…

【Java】使用iText依赖生成PDF文件

文章目录 使用iText实现PDF文件生成1. 需求2 . 添加依赖3. 核心4. 实战案例&#xff1a;生成录用通知书4.1 整体架构4.2 初始化PDF文档4.3 配置中文字体4.4 添加背景图片4.5 添加文本内容4.6 处理文档生成 5. 关键技巧与注意事项5.1 字体处理5.2 图片处理5.3 布局控制5.4 异常处…

探索人工智能在自然语言处理中的应用

探索人工智能在自然语言处理中的应用 前言1. 机器翻译2. 情感分析3. 智能客服4. 文本生成未来展望 结语 前言 在信息爆炸的时代&#xff0c;自然语言处理&#xff08;NLP&#xff09;作为人工智能&#xff08;AI&#xff09;的一个重要分支&#xff0c;正以前所未有的速度改变着…

LabVIEW提高开发效率技巧----节省内存

在LabVIEW开发过程中&#xff0c;内存管理是保障程序稳定性和性能的关键。本文将详细介绍如何通过队列处理来节省内存&#xff0c;尤其是如何通过解耦释放不再需要的数据&#xff0c;防止内存泄漏。通过多个实际例子&#xff0c;从不同角度探讨队列处理在大数据量或长时间运行的…