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.xml
            this.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() {

                @Override
                public boolean onQueryTextChange(String text) {
                    updateLayout(searchItem(text));
                    return false;
                }
            });
            //全选
            qxTv.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    if (sa.getSelectedItemPositions().size() == sa.getItemCount()) {
                        sa.clearSelection();
                    } else {
                        sa.selectAll();
                        resultList = sa.getSelectedItems();
                    }
                }
            });
            //取消按钮
            closeBtn.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    dialog.dismiss();
                    resultList.clear();
                }
            });
            //确认按钮
            okBtn.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    String json = new Gson().toJson(resultList);
                    selectedListiner.onSelected(json);
                    dialog.dismiss();
                    resultList.clear();
                }
            });

            dialog.setOnDismissListener(new OnDismissListener() {
                @Override
                public void onDismiss(DialogInterface dialog) {

                }
            });
            //item点击事件
            sa.setOnItemClickListener(new SearchSelectAdapter.OnItemClickListener() {
                @Override
                public 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() {
                @Override
                public 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 {
        @Override
        public void beforeTextChanged(CharSequence charSequence, int i, int i2, int i3) {

        }

        @Override
        public 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);
            }

        }

        @Override
        public void afterTextChanged(Editable editable) {
        }
    }

    @Override
    public 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<>();
    }

    @Override
    public int getItemCount() {
        return itemList.size();
    }


    public void setOnItemClickListener(OnItemClickListener listener) {
        this.onItemClickListener = listener;
    }

    @NonNull
    @Override
    public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        // 创建ViewHolder
        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.list_cell_select_single, parent, false);
        return new ViewHolder(view);
    }

    @Override
    public void onBindViewHolder(@NonNull ViewHolder holder, int position) {

        // 绑定数据到ViewHolder
        ItemModel item = itemList.get(position);
        holder.textView.setText(item.getItemName());

        //给条目布局设置点击事件
        holder.itemLayout.setOnClickListener(new View.OnClickListener() {
            @Override
            public 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">

    <LinearLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:background="@drawable/item_white_layout"
        android:orientation="vertical">

        <RelativeLayout
            android:layout_width="match_parent"
            android:layout_height="50dp">

            <TextView
                android: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.SearchView
            android:id="@+id/searchView"
            android:layout_width="match_parent"
            android:layout_height="wrap_content" />

        <TextView
            android: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.RecyclerView
            android:id="@+id/item_lv"
            android:layout_width="match_parent"
            android:layout_height="wrap_content" />

        <View
            android:layout_width="match_parent"
            android:layout_height="1dp"
            android:background="@color/grey" />

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="40dp"
            android:background="@color/transparent"
            android:gravity="center"
            android:orientation="horizontal">

            <LinearLayout
                android:id="@+id/diss_layout"
                android:layout_width="0dp"
                android:layout_height="match_parent"
                android:layout_weight="1"
                android:gravity="center">

                <TextView
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:text="取消"
                    android:textColor="@color/sea_blue" />

            </LinearLayout>

            <View
                android:layout_width="1dp"
                android:layout_height="match_parent"
                android:background="@color/grey" />


            <LinearLayout
                android:id="@+id/ok_layout"
                android:layout_width="0dp"
                android:layout_height="match_parent"
                android:layout_weight="1"
                android:gravity="center">

                <TextView
                    android: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">

    <LinearLayout
        android: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">

        <ImageButton
            android: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" />

        <EditText
            android: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" />

        <ImageButton
            android: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() {
            @Override
            public void onSelected(String info) {
                okTv.setText(info);
            }
        });
        SerachSelectDialog mDialog = alert.show();
        //设置Dialog 尺寸
        mDialog.setDialogWindowAttr(0.9, 0.9, this);
    }

三、总结

后续 Demo 会上传

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

A survey of loss functions for semantic segmentation——论文笔记

摘要 图像分割一直是一个活跃的研究领域&#xff0c;因为它有着广泛的应用范围&#xff0c;从自动疾病检测到自动驾驶汽车。过去五年中&#xff0c;各种论文提出了用于不同场景&#xff08;如数据偏斜、稀疏分割等&#xff09;的目标损失函数。在本文中&#xff0c;我们总结了…

NVR监测软件/设备EasyNVR多个NVR同时管理构建智慧城市的大数据解决方案

在当今的数字化时代&#xff0c;安防视频监控已成为各行各业不可或缺的一部分&#xff0c;无论是在智慧工地、智慧工厂、智慧景区还是智慧水利等领域&#xff0c;都需要高效、可靠的监控系统来保障安全。 一、背景需求分析 随着科技的发展&#xff0c;智慧城市建设成为城市发展…

★ 算法OJ题 ★ 前缀和算法(上)

Ciallo&#xff5e;(∠・ω< )⌒☆ ~ 今天&#xff0c;将和大家一起做几道前缀和算法题 ~ ❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️ 澄岚主页&#xff1a;椎名澄嵐-CSDN博客 算法专栏&#xff1a;★ 优选算法100天 ★_椎名澄嵐的博客-CSDN博客 ❄️❄️❄…

毕业设计选题:基于Django+Vue的物资配送管理系统的设计与实现

开发语言&#xff1a;Python框架&#xff1a;djangoPython版本&#xff1a;python3.7.7数据库&#xff1a;mysql 5.7数据库工具&#xff1a;Navicat11开发软件&#xff1a;PyCharm 系统展示 管理员登录界面 管理员功能界面 申领者管理 后勤处管理 物资信息管理 入库信息管理 …

i春秋web题库——题目名称:SQLi

WEB——SQLi 写在之前&#xff1a;题目简介&#xff1a;题目分析&#xff1a; 写在之前&#xff1a; 本题在CSDN上或是其它博客上有过解答&#xff0c;只不过不知是什么原因&#xff0c;我没有找到解题过程比较完整的文章。于是我决定在CTF初学阶段写一篇这样的博客&#xff0…

ctfshow(78->81)--文件包含漏洞

Web78 源代码如下&#xff1a; if(isset($_GET[file])){$file $_GET[file];include($file); }else{highlight_file(__FILE__);代码审计&#xff1a; 使用 include() 进行文件包含&#xff0c;通过GET方法 传递参数file 获取被包含的文件。 思路&#xff1a; 利用 data://…

已解决:Uncaught SyntaxError: Unexpected token <

已解决&#xff1a;Uncaught SyntaxError: Unexpected token < 文章目录 写在前面问题描述报错原因分析 解决思路解决办法1. 使用开发者工具检查网络请求2. 验证脚本路径3. 检查服务器配置4. 处理跨域请求5. 检查打包工具配置6. 确认内容类型7. 使用原始文件进行测试8. 处理…

基于SpringBoot的电商网站源码(前台+后台)

主要功能流程&#xff1a; 前台购物&#xff1a;用户在前台进行商品浏览、选购及下单。个人中心查看&#xff1a;用户登录后可在个人中心查看订单状态、个人信息等。后台发货&#xff1a;管理员在后台系统处理订单&#xff0c;包括发货、退款等操作。 运行环境&#xff1a; …

iOS 18.2 可让欧盟用户删除App Store、Safari、信息、相机和照片应用

升级到 iOS 18.2 之后&#xff0c;欧盟的 iPhone 用户可以完全删除一些核心应用程序&#xff0c;包括 App Store、Safari、信息、相机和 Photos 。苹果在 8 月份表示&#xff0c;计划对其在欧盟的数字市场法案合规性进行更多修改&#xff0c;其中一项更新包括欧盟用户删除系统应…

张三进阶之路 | 基于Spring AOP的Log收集

前情提要 &#x1f4cc; 张三对于公司的日志处理系统不满意&#xff0c;认为其性能不佳且功能有限。为了展示自己的能力和技术实力&#xff0c;他决定利用Spring AOP&#xff08;面向切面编程&#xff09;开发一个更高效的日志处理系统&#xff0c;并将其存储在Redis中。 首先…

初识算法 · 二分查找(4)

目录 前言&#xff1a; 寻找峰值 题目解析 算法原理 算法编写 寻找旋转排序数组中的最小值 题目解析 算法原理 算法编写 寻找缺失的数字 题目解析 算法原理 算法编写 前言&#xff1a; ​本文的主题是二分查找&#xff0c;通过三道题目讲解&#xff0c;一道是寻找…

超越OpenAI GPT-4o,Yi-Lightning指南:中国AI大模型新巅峰

Yi-Lightning 是零一万物公司最新发布的旗舰模型&#xff0c;它在国际权威盲测榜单 LMSYS 上超越了硅谷知名 OpenAI GPT-4o-2024-05-13、Anthropic Claude 3.5 Sonnet&#xff0c;排名世界第六&#xff0c;中国第一&#xff0c;这标志着中国大模型首次实现超越 OpenAI GPT-4o 的…

InnoDB 存储引擎的底层逻辑架构白话-必知必会

目录标题 前言白话内存架构1. 自适应哈希索引自适应哈希索引的作用自适应哈希索引的工作原理自适应哈希索引与缓存的区别启用和禁用自适应哈希索引 2. Buffer pool3. Change buffer 下面我们就来详细分析一下&#xff0c;数据修改操作的步骤。4. Log Buffer 磁盘架构1. 系统表空…

一文了解AOSP是什么?

一文了解AOSP是什么&#xff1f; AOSP基本信息 基本定义 AOSP是Android Open Source Project的缩写&#xff0c;这是一个由Google维护的完全免费和开放的操作系统开发项目。它是Android系统的核心基础&#xff0c;提供了构建移动操作系统所需的基本组件。 主要特点 完全开源…

echarts散点图

一、类似散点图折线图不展示折线 option {grid: {left: 10,right: 20,top: 35,bottom: 15,containLabel: true},tooltip: {show: true,trigger: item,backgroundColor: "rgba(0,0,0,0)", // 提示框浮层的背景颜色。formatter: function (params) {var html <d…

基于Python的B站视频数据分析与可视化

基于Python的B站视频数据分析与可视化 爬取视频、UP主信息、视频评论 功能列表 关键词搜索指定帖子ID爬取指定UP主的主页爬取支持评论爬取生成评论词云图支持数据存在数据库支持可视化 部分效果演示 关键词搜索爬取 指定UP主的主页爬取 指定为黑马的了 爬取视频的时爬取评论…

基于大模型的Milvus向量数据库的背景与实战应用,计算与索引机制,Python代码实现

大家好&#xff0c;我是微学AI&#xff0c;今天给大家介绍一下基于大模型的Milvus向量数据库的背景与实战应用&#xff0c;计算与索引机制&#xff0c;Python代码实现。本文详细介绍了milvus向量数据库的原理&#xff0c;并通过具体的数据样例和完整的Python代码实现&#xff0…

NodeJS连接MySQL 8.4报错:code: ‘ER_TABLEACCESS_DENIED_ERROR‘

NodeJS连接MySQL 8.4报错&#xff1a;code: ER_TABLEACCESS_DENIED_ERROR { code: ER_TABLEACCESS_DENIED_ERROR, errno: 1142, sqlMessage: "SELECT command denied to user 用户名localhost for table 表名", sqlState: 42000, index: 0, sql: SELECT …

SCR相对标准偏差、氨氮比、截面速度,多平面计算

SCR截面速度、氨氮比等标准及相对标准偏差计算。 程序用来处理fluent通过xyplot导出的数据&#xff0c;导出可以选择多个平面&#xff0c;可计算标准偏差SD、相对标准偏差RSD&#xff0c;平均速度,适用于求解多个平面 # -*- coding: utf-8 -*- """ Created on …

maven本地打jar包依赖

本地工程的pom文件中引入了mysql依赖&#xff0c;但是在maven库中没有拉下来&#xff0c;可以到mysql官网下载jar包&#xff0c;使用maven手动打包到本地仓库中&#xff1a; 官网地址&#xff1a;MySQL :: Download MySQL Connector/J (Archived Versions) 在jar包所在位置的路…