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

【Android】ListView和RecyclerView知识总结

文章目录

  • ListView
    • 步骤
    • 适配器Adpter
    • ArrayAdapter
    • SimpleAdapter
    • BaseAdpter
    • 效率问题
  • RecyclerView
    • 具体实现
    • 不同布局形式的设置
      • 横向滚动
      • 瀑布流
      • 网格
    • 点击事件

ListView

ListView 是 Android 中的一种视图组件,用于显示可滚动的垂直列表。每个列表项都是一个视图对象,ListView 会通过适配器(Adapter)将数据绑定到这些视图对象上。它通常用于显示一组相似的数据,比如联系人列表、消息列表等。

步骤

  1. 准备数据:这是数据源,通常是一个数组或一个List
  2. 构建适配器:适配器用于将数据映射到ListView的每一项。你可以使用系统提供的适配器(如ArrayAdapter)或者自定义适配器。
  3. 绑定适配器到ListView:将适配器设置到ListView上。
  4. 处理ListView项的点击事件:添加点击事件监听器来处理每一项的点击事件。

适配器Adpter

作用:充当 ListView 和数据源之间的桥梁,将数据源转换为可以显示在 ListView 中的视图项。

image-20240723093657352

常用适配器类型

  1. ArrayAdapter:适用于简单的数据源,如数组或列表。它将每个数据项转换为一个 TextView 或其他简单视图。
  2. SimpleAdapter:用于将复杂的数据源(如 List<Map<String, Object>>)绑定到多个视图。
  3. Custom Adapter:通过继承 BaseAdapter 或其他适配器类,可以创建自定义适配器以实现复杂的需求。

ArrayAdapter

新建一个ArrayListActivity类及其布局文件

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:id="@+id/main"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"><ListViewandroid:id="@+id/lv"android:layout_width="match_parent"android:layout_height="match_parent" /></LinearLayout>

添加入一个ListView控件

public class ArrayListActivity extends AppCompatActivity {private ListView mListView;private List<String> mStringList;private ArrayAdapter<String> mArrayAdapter;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_array_list);// 初始化 ListView。mListView = findViewById(R.id.lv);// 初始化字符串列表并填充数据。mStringList = new ArrayList<>();for (int i = 0; i < 50; i++) {mStringList.add("这是条目" + i);}// 使用 ArrayAdapter 绑定数据到 ListView。mArrayAdapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, mStringList);mListView.setAdapter(mArrayAdapter);// 设置 ListView 的点击事件。mListView.setOnItemClickListener((parent, view, position, id) -> {Toast.makeText(ArrayListActivity.this, "你点击了" + position, Toast.LENGTH_SHORT).show();});// 设置 ListView 的长按事件。mListView.setOnItemLongClickListener((parent, view, position, id) -> {Toast.makeText(ArrayListActivity.this, "你长按了" + position, Toast.LENGTH_SHORT).show();return true;});}
}
  • mListView = findViewById(R.id.lv);

    获得ListView组件

  • mStringList = new ArrayList<>();

    创建一个list储存信息

  • mArrayAdapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, mStringList);

    1. 创建了一个ArrayAdapter对象,命名为mArrayAdapter。
    2. 通过构造函数传入了三个参数:
      • this:表示当前的上下文对象,即这个ArrayAdapter将被用于当前的Activity或Fragment中。
      • android.R.layout.simple_list_item_1:表示列表项的布局文件,这里使用了Android系统提供的简单列表项布局,该布局只有一个文本视图。
      • mStringList:表示要显示的数据集合,即一个字符串列表。

    通过这个ArrayAdapter对象,可以将mStringList中的字符串显示在列表视图中。

  • mListView.setAdapter(mArrayAdapter);

    mArrayAdapter对象设置为mListView的适配器

实现效果:

Screenshot_2024-07-23-10-28-26-233_com.example.la

SimpleAdapter

SimpleAdapter是Android中用于将数据模型转换成ListView或其他视图组件的适配器。它简化了数据绑定过程,通过映射数据集中的字段到布局文件中的视图

同样新建一个ArrayListActivity类及其布局文件

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"xmlns:tools="http://schemas.android.com/tools"android:id="@+id/main"android:layout_width="match_parent"android:layout_height="match_parent"><ListViewandroid:id="@+id/lv"android:layout_width="match_parent"android:layout_height="match_parent" /></LinearLayout>

xml和刚才一致

public class SimpleListActivity extends AppCompatActivity {private ListView mListView;private SimpleAdapter msimpleAdapter;private List<Map<String, Object>> mList;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_simple_list);// 初始化ListViewmListView = findViewById(R.id.lv);// 初始化并填充列表数据mList = new ArrayList<>();for (int i = 0; i < 5; i++) {Map<String, Object> map1 = new HashMap<>();map1.put("image", R.drawable.apple);map1.put("text", "苹果");mList.add(map1);Map<String, Object> map2 = new HashMap<>();map2.put("image", R.drawable.banana);map2.put("text", "香蕉");mList.add(map2);Map<String, Object> map3 = new HashMap<>();map3.put("image", R.drawable.litchi);map3.put("text", "荔枝");mList.add(map3);}// 使用SimpleAdapter绑定数据到ListViewmsimpleAdapter = new SimpleAdapter(this, mList, R.layout.list_item_layout,new String[]{"image", "text"}, new int[]{R.id.image, R.id.tv});mListView.setAdapter(msimpleAdapter);} 
}
  • msimpleAdapter = new SimpleAdapter(this, mList, R.layout.list_item_layout,

    new String[]{"image", "text"}, new int[]{R.id.image, R.id.tv});

    1. 创建了一个SimpleAdapter对象,用于将数据绑定到ListView上。
    2. this:上下文对象,表示当前的Activity或Fragment。
    3. mList:数据源,通常是一个List集合,包含了要展示的数据。
    4. R.layout.list_item_layout:不同于刚才安卓自带的,这里我们使用自己创建的布局,下面的两个参数String[]是刚才map数组中的键,int[]是自定义布局中对应的视图id
    5. new String[]{"image", "text"}:数据源中要展示的字段名数组,这里表示要展示名为"image"和"text"的字段。
    6. new int[]{R.id.image, R.id.tv}:对应字段在布局文件中的控件ID数组,这里表示字段"image"对应ID为R.id.image的ImageView控件,字段"text"对应ID为R.id.tv的TextView控件
  • mListView.setAdapter(msimpleAdapter);

R.layout.list_item_layout:自定义的布局

<?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="horizontal"><ImageViewandroid:id="@+id/image"android:layout_width="0dp"android:layout_height="100dp"android:layout_weight="1" /><TextViewandroid:id="@+id/tv"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_weight="3" /></LinearLayout>

实际效果:
在这里插入图片描述

BaseAdpter

新建一个ItemBean类来存储数据

public class ItemBean {private String name;private int imageId;public ItemBean(String name, int imageId) {this.name = name;this.imageId = imageId;}public void setName(String name) {this.name = name;}public void setImageId(int imageId) {this.imageId = imageId;}public String getName() {return name;}public int getImageId() {return imageId;}
}

接下来为这个类构造适配器

继承BaseAdapter类,自动生成四个重写方法

/*** 自定义适配器,用于在ListView中显示物品列表。* 该适配器负责将数据集中的每个项目绑定到相应的视图上。*/
public class MyAdapter extends BaseAdapter {// 存储物品数据的列表private List<ItemBean> mlist;// LayoutInflater用于从XML文件中加载布局private LayoutInflater mLayoutInflater;// 上下文对象,用于获取资源和进行其他上下文相关的操作private Context mcontext;/*** 构造函数初始化适配器。* * @param mlist 物品数据的列表* @param mcontext 上下文对象,用于初始化LayoutInflater*/public MyAdapter(List<ItemBean> mlist, Context mcontext) {this.mlist = mlist;this.mcontext = mcontext;this.mLayoutInflater = LayoutInflater.from(mcontext);}//返回数据集的大小@Overridepublic int getCount() {return mlist.size();}//根据位置获取数据集中的物品。@Overridepublic Object getItem(int position) {return mlist.get(position);}// 获取物品在ListView中的唯一标识符@Overridepublic long getItemId(int position) {return position;}/*** 为ListView的每个项目创建并返回一个视图。* * @param position 物品的位置* @param convertView 当前被重用的视图* @param parent 视图的父容器* @return 绑定到数据集中的视图*/@Overridepublic View getView(int position, View convertView, ViewGroup parent) {// 使用LayoutInflater加载列表项的布局convertView = mLayoutInflater.inflate(R.layout.list_item_layout, parent, false);// 查找并初始化列表项中的ImageView和TextViewImageView img = convertView.findViewById(R.id.image);TextView tv = convertView.findViewById(R.id.tv);// 获取当前位置的物品数据,设置ImageView的图片资源ItemBean itemBean = mlist.get(position);img.setImageResource(itemBean.getImageId());tv.setText(itemBean.getName());return convertView;}
}
  • convertView = mLayoutInflater.inflate(R.layout.list_item_layout, parent, false);

    mLayoutInflater通过构造方法处的LayoutInflater.from(mcontext)赋值

    调用其inflate方法:

    1. convertView: 这个变量通常用来存储从布局文件转换而来的View对象。在ListViewRecyclerViewgetView()方法中,它会被检查是否为空。如果非空,那么会直接使用这个View对象来展示数据,以避免频繁创建新的View,从而提高性能。
    2. mLayoutInflater: 这是一个LayoutInflater实例,它是Android框架提供的一个类,用于将XML布局文件转换为对应的View对象。
    3. R.layout.list_item_layout: 这是一个资源ID,指向了XML布局文件list_item_layout.xml。这个布局文件定义了一个ListViewRecyclerView中单个item的外观和结构,包括控件的类型、大小、位置以及样式等。
    4. parent: 这是一个ViewGroup类型的参数,代表了新创建的View最终将被添加到的父容器。在ListViewRecyclerView的情况下,parent就是ListViewRecyclerView本身。虽然在这个调用中,我们并没有立即把新创建的View添加到parent中(因为false参数),但这个参数还是需要的,因为它会影响LayoutInflater如何计算View的尺寸和位置。
    5. false: 这个布尔值参数告诉LayoutInflater不要将生成的View添加到parent中。这是因为ListViewRecyclerView有自己的逻辑来管理子View的添加和移除,它们会在适当的时候将View添加到自己内部的ViewGroup中。

    下面是BaseAdpterActivity类,和前两个步骤相似

    public class BaseAdpterActivity extends AppCompatActivity {private ListView mListView;private BaseAdapter mBaseAdapter;private List<ItemBean> mlist;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_base_adpter);// 初始化数据列表,这里使用了循环来添加多个数据项。mlist = new ArrayList<>();for (int i = 0; i < 20; i++) {ItemBean itemBean1 = new ItemBean("apple", R.drawable.apple);ItemBean itemBean2 = new ItemBean("banana", R.drawable.banana);ItemBean itemBean3 = new ItemBean("litchi", R.drawable.litchi);mlist.add(itemBean1);mlist.add(itemBean2);mlist.add(itemBean3);}// 初始化ListView和其适配器mListView = findViewById(R.id.lv);mBaseAdapter = new MyAdapter(mlist, this);mListView.setAdapter(mBaseAdapter);}
    }
    

    效果:

    Screenshot_2024-07-23-12-24-11-021_com.example.la

效率问题

列表中信息的出现需要频繁调用getView方法,效率很低。

public class MyAdapter extends BaseAdapter {//省略这里代码.......@Overridepublic View getView(int position, View convertView, ViewGroup parent) {ViewHolder viewHolder;if (convertView == null) {// 如果convertView为空,说明该视图是第一次被创建convertView = mLayoutInflater.inflate(R.layout.list_item_layout, parent, false);viewHolder = new ViewHolder();viewHolder.img = convertView.findViewById(R.id.image);viewHolder.tv = convertView.findViewById(R.id.tv);convertView.setTag(viewHolder);} else {// 如果convertView不为空,说明该视图可以被复用,直接从标签中获取ViewHolder对象viewHolder = (ViewHolder) convertView.getTag();}// 获取当前位置的物品数据ItemBean itemBean = mlist.get(position);// 绑定数据到视图viewHolder.img.setImageResource(itemBean.getImageId());viewHolder.tv.setText(itemBean.getName());return convertView;}/*** ViewHolder类用于缓存ListView项的视图引用,* 以减少在getView方法中每次都需要通过findViewById查找视图的开销。*/class ViewHolder {ImageView img;TextView tv;}
}
  1. convertView为空:创建一个新的视图并初始化它,然后使用 setTag() 方法将一个包含子控件引用的对象与 convertView 关联起来。
  2. convertView不为null,则调用 getTag() 方法来获取之前存储的 ViewHolder 对象,这样就可以直接访问子控件而不需要再次查找它们。
  3. 使用setTag()getTag()方法来缓存这些子控件的引用
  4. ViewHolder:每次getView()方法被调用时,如果直接在视图中使用findViewById()方法来获取子视图,这会导致性能下降,因为findViewById()是一个耗时的操作。ViewHolder模式通过在视图首次创建时保存对所有子视图的引用,避免了后续滚动时的多次查找

RecyclerView

RecyclerView 是 Android 提供的一个更高级和灵活的列表视图控件,相对于 ListViewRecyclerView 提供了更多的功能和更好的性能。它引入了一些新的概念,如 ViewHolder 模式,更高效的滚动和动画支持,以及更灵活的布局管理器(LayoutManager)。

具体实现

可以实现和ListView一致的效果

Screenshot_2024-07-23-12-24-11-021_com.example.la

示例目录:

image-20240723154019488

  1. 主布局文件 activity_main.xml

加入RecyclerView控件,宽高设置match_parent占满布局。

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"xmlns:tools="http://schemas.android.com/tools"android:id="@+id/main"android:layout_width="match_parent"android:layout_height="match_parent"tools:context=".MainActivity"><androidx.recyclerview.widget.RecyclerViewandroid:id="@+id/rlv"android:layout_width="match_parent"android:layout_height="match_parent"android:textAllCaps="false"/></LinearLayout>
  1. 数据模型 FruitBean.java,和刚刚的一致
public class FruitBean implements Serializable {private String name;private int imageId;public FruitBean() {}public FruitBean(String name, int imageId) {this.name = name;this.imageId = imageId;}public void setName(String name) {this.name = name;}public void setImageId(int imageId) {this.imageId = imageId;}public String getName() {return name;}public int getImageId() {return imageId;}
}
  1. 自定义适配器MyAdapter
// RecyclerView的适配器类,用于将数据集中的数据绑定到RecyclerView的各个Item上。
//继承RecyclerView.Adapter,这里的泛型是下面的内部类
public class MyAdapter extends RecyclerView.Adapter<MyAdapter.MyViewHolder> {// 数据源列表private List<FruitBean> mList;// 布局填充器,用于将XML布局文件转换为View对象private LayoutInflater mLayoutInflater;// 上下文对象private Context mContext;//构造函数,初始化适配器。public MyAdapter(List<FruitBean> mList, Context mContext) {this.mList = mList;this.mContext = mContext;this.mLayoutInflater = LayoutInflater.from(mContext);}@NonNull@Overridepublic MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {// 将布局文件转换为View对象View view = mLayoutInflater.inflate(R.layout.list_item_layout, parent, false);// 创建并返回ViewHolder实例MyViewHolder myViewHolder = new MyViewHolder(view);return myViewHolder;}// 将数据绑定到ViewHolder,在RecyclerView滚动时会不断调用@Overridepublic void onBindViewHolder(@NonNull MyViewHolder holder, int position) {// 获取当前项的数据FruitBean fruitBean = mList.get(position);// 将数据绑定到ViewHolder中的TextView和ImageViewholder.tv.setText(fruitBean.getName());holder.img.setImageResource(fruitBean.getImageId());}@Overridepublic int getItemCount() {return mList.size();}// ViewHolder类,用于持有每个列表项的视图class MyViewHolder extends RecyclerView.ViewHolder {// 列表项中的ImageView和TextViewprivate ImageView img;private TextView tv;public MyViewHolder(View view) {super(view);// 通过itemView获取布局中的控件,并设置参数this.img = view.findViewById(R.id.image);this.tv = view.findViewById(R.id.tv);}}
}
  1. MainActivity
public class MainActivity extends AppCompatActivity {// 声明RecyclerView、数据列表和适配器private RecyclerView mrecyclerView;private List<FruitBean> mlist;private MyAdapter myAdapter;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);// 初始化数据initData();// 绑定RecyclerView,设置适配器mrecyclerView = findViewById(R.id.rlv);myAdapter = new MyAdapter(mlist, this);mrecyclerView.setAdapter(myAdapter);// 设置布局管理器,这里是竖向滚动RecyclerView.LayoutManager layoutManager = new LinearLayoutManager(this);mrecyclerView.setLayoutManager(layoutManager);}// 初始化数据列表,添加多个水果项private void initData() {mlist = new ArrayList<>();for (int i = 0; i < 20; i++) {FruitBean itemBean1 = new FruitBean("apple", R.drawable.apple);FruitBean itemBean2 = new FruitBean("banana", R.drawable.banana);FruitBean itemBean3 = new FruitBean("litchi", R.drawable.litchi);mlist.add(itemBean1);mlist.add(itemBean2);mlist.add(itemBean3);}}
}

不同布局形式的设置

横向滚动

只用改一行代码

 RecyclerView.LayoutManager layoutManager = new LinearLayoutManager(this,LinearLayoutManager.HORIZONTAL,false);mrecyclerView.setLayoutManager(layoutManager);

new LinearLayoutManager(this, LinearLayoutManager.HORIZONTAL, false)

  • 这里创建了一个LinearLayoutManager实例
  • this:传入的是当前Activity的上下文(Context)。
  • LinearLayoutManager.HORIZONTAL:表示RecyclerView的布局方向为水平(HORIZONTAL),即列表项将水平排列。
  • false:表示不反转布局。false意味着列表项从起点到终点正常排列,如果设置为true,列表项将从终点到起点反向排列。

瀑布流

RecyclerView.LayoutManager layoutManager = new StaggeredGridLayoutManager(2,StaggeredGridLayoutManager.VERTICAL);

new StaggeredGridLayoutManager(2, StaggeredGridLayoutManager.HORIZONTAL)

  • 2:表示布局中有2个跨度(列或行,取决于方向)。在水平布局中,这表示有2行。
  • StaggeredGridLayoutManager.HORIZONTAL:表示RecyclerView的布局方向为垂直,即列表项将垂直排列,并且每一列包含多个项目。

网格

RecyclerView.LayoutManager layoutManager = new GridLayoutManager(this,2);

new GridLayoutManager(this, 2)

  • this:传入的是当前Activity的上下文(Context)。
  • 2:表示布局中有2个跨度(列)。这意味着RecyclerView的每一行将包含2个项目。

点击事件

ViewHolder中添加rlContainer变量来保存最外层布局的实例,再在onBindViewHolder方法中为他注册点击事件

public class MyAdapter extends RecyclerView.Adapter<MyAdapter.MyViewHolder> {
//省略@Overridepublic void onBindViewHolder(@NonNull MyViewHolder holder, int position) {FruitBean fruitBean = mList.get(position);holder.tv.setText(fruitBean.getName());holder.img.setImageResource(fruitBean.getImageId());// 设置容器布局的点击事件holder.rlContainer.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {Toast.makeText(mContext, "你点击了" + position, Toast.LENGTH_SHORT).show();}});}class MyViewHolder extends RecyclerView.ViewHolder {private ImageView img;private TextView tv;//添加最外层的布局属性RelativeLayout rlContainer;public MyViewHolder(View view) {super(view);this.img = view.findViewById(R.id.image);this.tv = view.findViewById(R.id.tv);this.rlContainer = view.findViewById(R.id.rl_item_container);}}
}


感谢您的阅读
如有错误烦请指正


参考:

  1. 26-Android中的列表-RecyclerView_哔哩哔哩_bilibili
  2. 【Android】Fragment的静态动态创建以及两种创建方式的生命周期-CSDN博客
  3. 《第一行代码》

相关文章:

【Android】ListView和RecyclerView知识总结

文章目录 ListView步骤适配器AdpterArrayAdapterSimpleAdapterBaseAdpter效率问题 RecyclerView具体实现不同布局形式的设置横向滚动瀑布流网格 点击事件 ListView ListView 是 Android 中的一种视图组件&#xff0c;用于显示可滚动的垂直列表。每个列表项都是一个视图对象&…...

泛域名绑定到wordpress网站二级目录

要将WordPress的泛域名绑定到二级目录&#xff0c;你需要在你的服务器上修改Apache或Nginx配置文件。以下是两种最常见的服务器配置的示例&#xff1a; Apache服务器 编辑你的虚拟主机配置文件&#xff0c;通常位于/etc/apache2/sites-available/目录下。 <VirtualHost *…...

8、从0搭建企业门户网站——网站部署

目录 正文 1、域名解析 2、云服务器端口授权 3、Mysql数据库初始化 4、上传网站软件包 5、Tomcat配置 6、运行Tomcat 7、停止Tomcat 8、部署后发现验证码无法使用 完毕! 正文 当云服务器租用、域名购买和软件开发都完成后,我们就可以开始网站部署上线,ICP备案会长…...

uniapp中出现图片过小会与盒子偏离

结论&#xff1a;在image的父盒子中加上display: flex&#xff0c;原因不清楚 出问题的代码和图片如下&#xff1a; <template><view style" background-color: greenyellow; height: 10rpx;width: 10rpx;"><image :src"imgSrc.seatnull" …...

MySQL练手 --- 1934. 确认率

题目链接&#xff1a;1934. 确认率 思路 由题可知&#xff0c;两个表&#xff0c;一个表为Signups注册表&#xff0c;另一个表为Confirmations信息确认表&#xff0c;表的关联关系为 一对一&#xff0c;且user_id作为两个表的连接条件&#xff08;匹配字段&#xff09;&#…...

【OpenCV C++20 学习笔记】扫描图片数据

扫描图片数据 应用情景图像数据扫描的难点颜色空间缩减&#xff08;color space reduction&#xff09;查询表 扫描算法计算查询表统计运算时长连续内存3种扫描方法C风格的扫描方法迭代器方法坐标方法LUT方法 算法效率对比结论 应用情景 图像数据扫描的难点 在上一篇文章《基…...

LeetCode:爬楼梯(C语言)

1、问题概述&#xff1a;每次可以爬 1 或 2 个台阶。有多少种不同的方法可以爬到楼顶 2、示例 示例 1&#xff1a; 输入&#xff1a;n 2 输出&#xff1a;2 解释&#xff1a;有两种方法可以爬到楼顶。 1. 1 阶 1 阶 2. 2 阶 示例 2&#xff1a; 输入&#xff1a;n 3 输出&a…...

银河麒麟(arm64)环境下通过docker安装postgis3,并实现数据整体迁移

银河麒麟(arm64)环境下通过docker安装postgis3,并实现数据整体迁移 硬件配置:麒麟9006C 系统环境:银河麒麟桌面版v10 sp1 数据库:postgresql11+postgis3.0 具体的步骤参考https://blog.csdn.net/qq_34817440/article/details/103914574 -----主要操作-----------------…...

C语言 | Leetcode C语言题解之第278题第一个错误的版本

题目&#xff1a; 题解&#xff1a; int firstBadVersion(int n) {int left 1, right n;while (left < right) { // 循环直至区间左右端点相同int mid left (right - left) / 2; // 防止计算时溢出if (isBadVersion(mid)) {right mid; // 答案在区间 [left, mid] 中…...

京东科技集团将在香港发行与港元1:1挂钩的加密货币稳定币

据京东科技集团旗下公司京东币链科技(香港)官网信息&#xff0c;京东稳定币是一种基于公链并与港元(HKD) 1:1挂钩的稳定币&#xff0c;将在公共区块链上发行&#xff0c;其储备由高度流动且可信的资产组成&#xff0c;这些资产安全存放于持牌金融机构的独立账户中&#xff0c;通…...

Vue 实现电子签名并生成签名图片

目录 前言项目结构代码实现 安装依赖创建签名画布组件生成签名图片 总结相关阅读 1. 前言 电子签名在现代Web应用中越来越普遍&#xff0c;例如合同签署、确认表单等。本文将介绍如何使用Vue.js实现一个简单的电子签名功能&#xff0c;并将签名生成图片。 2. 项目结构 项…...

Visual Studio 2022美化

说明&#xff1a; VS版本&#xff1a;Visual Studio Community 2022 背景美化 【扩展】【管理扩展】搜索“ClaudiaIDE”&#xff0c;【下载】&#xff0c;安装完扩展要重启VS 在wallhaven下载壁纸图片作为文本编辑器区域背景图片 【工具】【选项】搜索ClaudiaIDE&#xff…...

[CISCN2019 华东南赛区]Web11

进来先做信息收集&#xff0c;右上角显示当前ip&#xff0c;然后有api的调用地址和请求包的格式以及最重要的是最下面的smarty模版&#xff0c;一看到这个就得想到smarty模版注入 测试了一下两个api都无法访问 直接切到数据包看看能不能通过XFF来修改右上角ip 成功修改&#x…...

【图形图像-1】SDF

在图形图像处理中&#xff0c;SDF&#xff08;Signed Distance Field&#xff0c;带符号的距离场&#xff09;是一种表示图形轮廓和空间距离的数学结构。它通常用于计算机图形学、文本渲染、碰撞检测和物理模拟等领域。 SDF&#xff08;Signed Distance Field&#xff0c;带符号…...

苍穹外卖01

0. 配置maven (仅一次的操作 1.项目导入idea 2. 保证nginx服务器运行 &#xff08;nginx.exe要在非中文的目录下&#xff09; 开启服务&#xff1a; start nginx 查看任务进程是否存在&#xff1a; tasklist /fi "imagename eq nginx.exe" 关闭ngi…...

ElasticSearch(三)—文档字段参数设置以及元字段

一、 字段参数设置 analyzer&#xff1a; 指定分词器。elasticsearch 是一款支持全文检索的分布式存储系统&#xff0c;对于 text类型的字段&#xff0c;首先会使用分词器进行分词&#xff0c;然后将分词后的词根一个一个存储在倒排索引中&#xff0c;后续查询主要是针对词根…...

ARM功耗管理之压力测试和PM_DEBUG实验

安全之安全(security)博客目录导读 ARM功耗管理精讲与实战汇总参见&#xff1a;Arm功耗管理精讲与实战 思考&#xff1a;睡眠唤醒实验&#xff1f;压力测试&#xff1f;Suspend-to-Idle/RAM/Disk演示&#xff1f; 1、实验环境准备 2、软件代码准备 3、唤醒源 4、Suspend-…...

ESP8266用AT指令实现连接MQTT

1准备工作 硬件&#xff08;ESP8266&#xff09;连接电脑 硬件已经烧入了MQTT透传固件 2实现连接 2-1&#xff08;进入AT模式&#xff09; 打开串口助手发送如下指令 AT 2-2&#xff08;复位&#xff09; ATRST 2-3&#xff08;开启DHCP&#xff0c;自动获取IP&#x…...

人工智能与机器学习原理精解【5】

文章目录 最优化基础理论特征值&#xff08;Eigenvalue&#xff09;特征向量&#xff08;Eigenvector&#xff09;特征值和特征向量的重要性计算方法特征值一、特征值分解的定义二、特征值分解的算法三、特征值分解的例子 正定矩阵Hessian矩阵的特征值Hessian矩阵的含义Hessian…...

为什么用LeSS?

实现适应性 LeSS是一个产品开发的组织系统&#xff0c;旨在最大化一个组织的适应性。关于适应性&#xff08;或者敏捷性&#xff0c;也就是敏捷开发的初衷&#xff09;我们是指优化&#xff1a; 以相对低的成本改变方向的能力&#xff0c;主要是基于通过频繁交付产生的探索。从…...

力扣高频SQL 50题(基础版)第七题

文章目录 力扣高频SQL 50题&#xff08;基础版&#xff09;第七题1068. 产品销售分析 I题目说明思路分析实现过程准备数据&#xff1a;实现方式&#xff1a;结果截图:总结&#xff1a; 力扣高频SQL 50题&#xff08;基础版&#xff09;第七题 1068. 产品销售分析 I 题目说明 …...

【音视频】一篇文章区分直播与点播、推流与拉流

文章目录 前言直播和点播的概念及区别直播是什么点播是什么 直播和点播的区别举例说明推流与拉流推流是什么拉流是什么 推流与拉流的区别举例说明 总结 前言 在音视频领域&#xff0c;直播、点播、推流和拉流是常见的概念&#xff0c;每个术语都有其特定的含义和应用场景。了解…...

3d动画软件blender如何汉化?(最新版本4.2)

前言 Blender是一个非常强大的3d动画软件&#xff0c;总能受到大量工作者的青睐。 但是&#xff0c;对于新手来说&#xff08;尤其是英语学渣&#xff09;&#xff0c;语言是个难事。大部分blender打开时都是英文&#xff0c;对新手使用具有一定的障碍。因此&#xff0c;我们需…...

C++学习笔记04-补充知识点(问题-解答自查版)

前言 以下问题以Q&A形式记录&#xff0c;基本上都是笔者在初学一轮后&#xff0c;掌握不牢或者频繁忘记的点 Q&A的形式有助于学习过程中时刻关注自己的输入与输出关系&#xff0c;也适合做查漏补缺和复盘。 本文对读者可以用作自查&#xff0c;答案在后面&#xff0…...

Vue el-table的自定义排序返回值为null,设置刷新页面保持排序标志,导航时elementui组件不更新

自定义排序使用sort-change"sortChange"监听&#xff0c;表列需设置为sortable“custom”&#xff08;自定义&#xff09; <el-table:data"tableData"bordersort-change"sortChange":default-sort"{prop:sortProp,order:sortOrder}&quo…...

一起笨笨的学C ——16链表基础

目录 目录 前言 正文 链表定义&#xff1a; 基本创建链表程序&#xff1a; 链表结点插入&#xff1a; 对角线记忆法&#xff1a; 画图理解法&#xff1a; 链表结点删除&#xff1a; 链表销毁&#xff1a; 后语 前言 链表理解方法分享&#xff0c;愿你的大脑也能建立一个…...

信息学奥赛一本通1917:【01NOIP普及组】装箱问题

1917&#xff1a;【01NOIP普及组】装箱问题 时间限制: 1000 ms 内存限制: 65536 KB 提交数: 4178 通过数: 2473 【题目描述】 有一个箱子容量为VV(正整数&#xff0c;0≤V≤200000≤V≤20000&#xff09;&#xff0c;同时有n个物品&#xff08;0≤n≤300≤n≤30),…...

android user 版本如何手动触发dump

项目需要在android user版本增加手动触发dump方法&#xff0c;用以确认user版本发生dump后系统是重启还是真正发生dump卡机&#xff01; 本文以qcom平台项目为例描述所做的修改&#xff0c;留下足迹以备后忘。 闲言少叙&#xff0c;开整上干货&#xff1a; 一、修改bin文件 …...

RedHat Linux 7.5 安装 mssql-server

RedHat Linux 7.5 安装 mssql-server 1、安装部署所需的依赖包 [rootlocalhost ~]# yum -y install libatomic bzip2 gdb cyrus-sasl cyrus-sasl-gssapi Loaded plugins: ulninfo Resolving Dependencies --> Running transaction check ---> Package bzip2.x86_64 0:1…...

Vue的SSR和预渲染:提升首屏加载速度与SEO效果

引言 在现代Web应用开发中,首屏加载速度和搜索引擎优化(SEO)是衡量应用性能的重要指标。Vue.js 作为流行的前端框架,提供了服务器端渲染(SSR)和预渲染(prerendering)两种技术来提升这些指标。本文将深入探讨如何使用 Vue 的 SSR 和预渲染技术,提供详细的代码示例和最…...

若依ruoyi+AI项目二次开发(智能售货机运营管理系统)

(一) 帝可得 - 产品原型 - 腾讯 CoDesign (qq.com)...

【SpringBoot】 4 Thymeleaf

官网 https://www.thymeleaf.org/ 介绍 Thymeleaf 是一个适用于 Web 和独立环境的现代服务器端 Java 模板引擎。 模板引擎&#xff1a;为了使用户界面和业务数据分离而产生的&#xff0c;它可以生成特定格式的文档&#xff0c;用于网站的模板引擎会生成一个标准的 html 文档…...

动静资源的转发操作

目录 Nginx中的location指令 静态资源的转发 动态资源的转发 注意事项 深入研究 如何在Nginx中实现对特定后缀文件的静态资源进行反向代理&#xff1f; Nginx中location指令的优先级是怎样确定的&#xff1f; 为什么在使用proxy_pass时要区分是否带有斜杠&#xff1f; N…...

Windows系统安全加固方案:快速上手系统加固指南(上)

无论是个人用户、小型企业还是大型机构&#xff0c;都需要采取措施保护其计算机系统免受各种威胁、系统加固常见的应用场景有个人用户、 AWD 比赛、公共机构以及企业环境等等 文档目录 一、Windows常用命令二、Windows常见端口三、账户安全3.1 默认账户安全3.2 按照用户分配账户…...

git连接远程仓库

一、本地新建代码,上传到远程仓库 1.git init #初始化本地仓库 2.git remote -v #查看当前仓库的远程地址 3.git remote add origin 远程仓库的URL 4.git branch master / git branch dev 创建 主分支或者 dev 分支 5.git checkout master/dev. 切换到主分支或者dev 分支…...

算法-----递归~~搜索~~回溯(宏观认识)

目录 1.什么是递归 1.1二叉树的遍历 1.2快速排序 1.3归并排序 2.为什么会用到递归 3.如何理解递归 4.如何写好一个递归 5.什么是搜索 5.1深度&#xff08;dfs&#xff09;优先遍历&优先搜索 5.2宽度&#xff08;bfs&#xff09;优先遍历&优先搜索 6.回溯 1.什…...

【云原生】Docker搭建知识库文档协作平台Confluence

目录 一、前言 二、企业级知识库文档工具部署形式 2.1 开源工具平台 2.1.1 开源工具优点 2.1.2 开源工具缺点 2.2 私有化部署 2.3 混合部署 三、如何选择合适的知识库平台工具 3.1 明确目标和需求 3.2 选择合适的知识库平台工具 四、Confluence介绍 4.2 confluence特…...

序列化与反序列化的本质

1. 将对象存储到本地 假如有一个student类&#xff0c;我们定义了好几个对象&#xff0c;想要把这些对象存储下来&#xff0c;该怎么办呢 from typing import List class Student:name: strage: intphones: List[str] s1 Student("xiaoming",10,["huawei&quo…...

飞牛爬虫FlyBullSpider 一款简单方便强大的爬虫,限时免费 特别适合小白!用它爬下Boss的2024年7月底Java岗位,分析一下程序员就业市场行情

一、下载安装FlyBullSpider 暂时支持Window,现在只在Win11上做过测试 1 百度 点击百度网盘 下载 链接&#xff1a;https://pan.baidu.com/s/1gSLKYuezaZgd8iqrXhk8Kg 提取码&#xff1a;Fly6 2 csdn https://download.csdn.net/download/fencer911/89584687 二、体验初…...

EXCEL 排名(RANK,COUNTIFS)

1.单列排序 需求描述&#xff1a;如有下面表格&#xff0c;需要按笔试成绩整体排名。 解决步骤&#xff1a; 我们使用RANK函数即可实现单列整体排名。 Number 选择第一列。 Ref 选择这一整列&#xff08;CtrlShift向下箭头、再按F4&#xff09;。 "确定"即可计算…...

【踩坑系列-JS】iframe中的url参数获取

Author&#xff1a;赵志乾 Date&#xff1a;2024-07-24 Declaration&#xff1a;All Right Reserved&#xff01;&#xff01;&#xff01; 1. 问题描述 系统A的页面中以iframe的方式嵌入了系统B的页面&#xff0c;并需要将A页面url中的参数传递给B页面。 最初的实现方式是&am…...

测试工作中常听到的名词解释 : )

背景 很多名称其实看字面意思都挺抽象的&#xff0c;有时看群里的测试大佬在不停蹦这类术语&#xff0c;感觉很高大上&#xff0c;但其实很多你应该是知道的&#xff0c;只不过没想到别人是这样叫它的。又或者你的主编程语言不是 Java&#xff0c;所以看不懂他们在讲啥&#x…...

Linux内网离线用rsync和inotify-tools实现文件夹文件单向同步和双向同步

lsyncd实现方式可参考&#xff1a;https://www.jianshu.com/p/c075ccf89516 安装文件下载&#xff1a;相关文件下载 rsync默认都有&#xff0c;所以没有提供。 服务端和客户端均操作 服务端&#xff1a;双向同步其实都是服务端&#xff0c;只是单向同步时稍有区别 客户端&am…...

Spring Security学习笔记(二)Spring Security认证和鉴权

前言&#xff1a;本系列博客基于Spring Boot 2.6.x依赖的Spring Security5.6.x版本 上一篇博客介绍了Spring Security的整体架构&#xff0c;本篇博客要讲的是Spring Security的认证和鉴权两个重要的机制。 UsernamePasswordAuthenticationFilter和BasicAuthenticationFilter是…...

产品经理NPDP好考吗?

NPDP是新产品开发专业人员的资格认证&#xff0c;对于希望在产品管理领域取得认可的专业人士来说&#xff0c;NPDP认证是一项重要的资格。 那么&#xff0c;产品经理考取NPDP资格认证究竟难不难呢&#xff1f; 首先&#xff0c;NPDP考试的难易程度取决于考生的背景和准备情况…...

【C++】:红黑树的应用 --- 封装map和set

点击跳转至文章&#xff1a;【C】&#xff1a;红黑树深度剖析 — 手撕红黑树&#xff01; 目录 前言一&#xff0c;红黑树的改造1. 红黑树的主体框架2. 对红黑树节点结构的改造3. 红黑树的迭代器3.1 迭代器类3.2 Begin() 和 End() 四&#xff0c;红黑树相关接口的改造4.1 Find…...

unity美术资源优化(资源冗余,主界面图集过多)

图片资源冗余&#xff1a; UPR unity的性能优化工具检查资源 1.检查纹理读/写标记 开启纹理资源的读/写标志会导致双倍的内存占用 检查Inspector -> Advanced -> Read/Write Enabled选项 2.检查纹理资源alpha通道 如果纹理的alpha通道全部为0&#xff0c;或者全部为2…...

【git】github中的Pull Request是什么

在 Git 中&#xff0c;"pull request"&#xff08;简称 PR&#xff09;是一种在分布式版本控制系统中使用的功能&#xff0c;特别是在使用 GitHub、GitLab、Bitbucket 等基于 Git 的代码托管平台时。Pull Request 允许开发者请求将他们的代码更改合并到另一个分支&am…...

gitlab查询分支API显示不全,只有20个问题

背景 gitlab查询分支API需要查询所有分支&#xff0c;且分支数量大于20&#xff0c;但目前调用接口返回的branch最多就显示了20个 解决方案 根据GitLab的文档&#xff0c;查询分支API默认最多返回20个分支。如果要一次性显示80个分支&#xff0c;可以使用分页参数来获取所有…...

vue3+vite 实现动态引入某个文件夹下的组件 - glob-import的使用

<template><div class"user-content"><HeaderTitle title"用户详情"></HeaderTitle><div class"main-content"><div><UserForm /></div><div><TableList></TableList></d…...