一篇博客理解Recyclerview的使用

从Android 5.0开始,谷歌公司推出了RecylerView控件,当看到RecylerView这个新控件的时候,大部分人会首先发出一个疑问,recylerview是什么?为什么会有recylerview也就是说recylerview的优点是什么?recylerview怎么用?等等,下面我们将深入解析recylerview。

1.RecyclerView是什么?

RecyclerView是support-v7包中的新组件,是一个强大的滑动组件,与经典的ListView相比,同样拥有item回收复用的功能,这一点从它的名字Recyclerview即回收view也可以看出。看到这也许有人会问,不是已经有ListView了吗,为什么还要RecyclerView呢?这就牵扯到第二个问题了。

2.RecyclerView的优点是什么?

根据官方的介绍RecyclerView是ListView的升级版,既然如此那RecyclerView必然有它的优点,现就RecylerView相对于ListView的优点罗列如下: ① RecyclerView封装了viewholder的回收复用,也就是说RecyclerView标准化了ViewHolder,编写Adapter面向的是ViewHolder而不再是View了,复用的逻辑被封装了,写起来更加简单。 ② 提供了一种插拔式的体验,高度的解耦,异常的灵活,针对一个Item的显示RecyclerView专门抽取出了相应的类,来控制Item的显示,使其的扩展性非常强。例如:你想控制横向或者纵向滑动列表效果可以通过LinearLayoutManager这个类来进行控制(与GridView效果对应的是GridLayoutManager,与瀑布流对应的还StaggeredGridLayoutManager等),也就是说RecyclerView不再拘泥于ListView的线性展示方式,它也可以实现GridView的效果等多种效果。你想控制Item的分隔线,可以通过继承RecyclerView的ItemDecoration这个类,然后针对自己的业务需求去抒写代码。 ③ 可以控制Item增删的动画,可以通过ItemAnimator这个类进行控制,当然针对增删的动画,RecyclerView有其自己默认的实现。

recyclerView = (RecyclerView) findViewById(R.id.recyclerView);  
LinearLayoutManager layoutManager = new LinearLayoutManager(this );  
//设置布局管理器  
recyclerView.setLayoutManager(layoutManager);  
//设置为垂直布局,这也是默认的  
layoutManager.setOrientation(OrientationHelper. VERTICAL);  
//设置Adapter  
recyclerView.setAdapter(recycleAdapter);  //设置分隔线  
recyclerView.addItemDecoration( new DividerGridItemDecoration(this ));  
//设置增加或删除条目的动画  
recyclerView.setItemAnimator( new DefaultItemAnimator());  

可以看到对RecylerView的设置过程,比ListView要复杂一些,虽然代码抒写上有点复杂,但它的扩展性是极高的。在了解了RecyclerView的一些控制之后,紧接着来看看它的Adapter的写法,RecyclerView的Adapter与ListView的Adapter还是有点区别的,RecyclerView.Adapter,需要实现3个方法: a) onCreateViewHolder() 这个方法主要生成为每个Item inflater出一个View,但是该方法返回的是一个ViewHolder。该方法把View直接封装在ViewHolder中,然后我们面向的是ViewHolder这个实例,当然这个ViewHolder需要我们自己去编写。直接省去了当初的convertView.setTag(holder)和convertView.getTag()这些繁琐的步骤。

b) onBindViewHolder() 这个方法主要用于适配渲染数据到View中。方法提供给你了一viewHolder而不是原来的convertView。

c) getItemCount() 这个方法就类似于BaseAdapter的getCount方法了,即总共有多少个条目。接下来通过几个小的实例帮助大家更深入的了解RecyclerView的用法。

例子1:用RecyclerView实现一个图片滚动的列表 代码如下:

public class MainActivity extends ActionBarActivity {private RecyclerView mRecyclerView;private List<Integer> mDatas;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);initData();// 得到控件mRecyclerView = (RecyclerView) findViewById(R.id.recyclerview);// 设置布局管理器LinearLayoutManager layoutManager = new LinearLayoutManager(this);layoutManager.setOrientation(LinearLayoutManager.HORIZONTAL);mRecyclerView.setLayoutManager(layoutManager);// 设置适配器mRecyclerView.setAdapter(new MyRecyclerAdapter(this, mDatas));}private void initData() {mDatas = new ArrayList<Integer>(Arrays.asList(R.drawable.kenan1,R.drawable.kenan2, R.drawable.kenan3, R.drawable.kenan4,R.drawable.kenan5, R.drawable.kenan6, R.drawable.kenan7,R.drawable.kenan8));}
}
public class DividerItemDecoration extends ItemDecoration {public DividerItemDecoration() {super();// TODO Auto-generated constructor stub}@Overridepublic void getItemOffsets(Rect outRect, View view, RecyclerView parent,State state) {// TODO Auto-generated method stubsuper.getItemOffsets(outRect, view, parent, state);}@Override@Deprecatedpublic void onDraw(Canvas c, RecyclerView parent) {// TODO Auto-generated method stubsuper.onDraw(c, parent);}}
public class MyRecyclerAdapter extends Adapter<MyRecyclerAdapter.MyHolder> {private Context mContext;private List<Integer> mDatas;public MyRecyclerAdapter(Context context, List<Integer> datas) {super();this.mContext = context;this.mDatas = datas;}@Overridepublic int getItemCount() {// TODO Auto-generated method stubreturn mDatas.size();}@Override// 填充onCreateViewHolder方法返回的holder中的控件public void onBindViewHolder(MyHolder holder, int position) {// TODO Auto-generated method stubholder.imageView.setImageResource(mDatas.get(position));}@Override// 重写onCreateViewHolder方法,返回一个自定义的ViewHolderpublic MyHolder onCreateViewHolder(ViewGroup arg0, int arg1) {// 填充布局View view = LayoutInflater.from(mContext).inflate(R.layout.item, null);MyHolder holder = new MyHolder(view);return holder;}// 定义内部类继承ViewHolderclass MyHolder extends ViewHolder {private ImageView imageView;public MyHolder(View view) {super(view);imageView = (ImageView) view.findViewById(R.id.iv_item);}}}

效果如下:

这里写图片描述

这里写图片描述

3.为RecyclerView添加OnItemClickListener回调

效果很不错,这就是RecyclerView的基本用法了,但细心的你会发现,竟然没有提供setOnItemClickListener这个回调,也就是无法响应点击事件,然而在日常开发中,响应点击事件无疑都是必须的,虽然它没有提供,但是我们可以手动添加OnItemClickListener,我们可以在Adapter中添加这个回调接口:

例子2:可以点击的RecyclerView 在原工程基础上对Adapter进行修改,添加OnItemClickListener接口,由于具体点击后的逻辑是交给MainActivity去确定的,所以我们定义抽象的OnItemClickListener接口,里面有一个抽象方法,用于设置被点击后的逻辑:

//item的回调接口public interface OnItemClickListener{void onItemClick(View view,int Position);}

对外暴露一个设置点击监听器的方法,其中传入需要OnItemClickListener接口

//定义一个设置点击监听器的方法public void setOnItemClickListener(OnItemClickListener itemClickListener) {this.mItemClickListener = itemClickListener;}

在绑定ViewHolder的逻辑之中,对RecyclerView的每一个itemView设置点击事件:

@Override// 填充onCreateViewHolder方法返回的holder中的控件public void onBindViewHolder(final MyHolder holder, final int position) {// TODO Auto-generated method stubholder.imageView.setImageResource(mDatas.get(position));//如果设置了回调,则设置点击事件  if(mItemClickListener != null){holder.itemView.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {mItemClickListener.onItemClick(holder.itemView, position);}});}}

最后粘上Adapter的全部代码,其他代码均和例子1一样

public class MyRecyclerAdapter extends Adapter<MyRecyclerAdapter.MyHolder> {private Context mContext;private List<Integer> mDatas;private OnItemClickListener mItemClickListener;public MyRecyclerAdapter(Context context, List<Integer> datas) {super();this.mContext = context;this.mDatas = datas;}//item的回调接口public interface OnItemClickListener{void onItemClick(View view,int Position);}//定义一个设置点击监听器的方法public void setOnItemClickListener(OnItemClickListener itemClickListener) {this.mItemClickListener = itemClickListener;}@Overridepublic int getItemCount() {// TODO Auto-generated method stubreturn mDatas.size();}@Override// 填充onCreateViewHolder方法返回的holder中的控件public void onBindViewHolder(final MyHolder holder, final int position) {// TODO Auto-generated method stubholder.imageView.setImageResource(mDatas.get(position));//如果设置了回调,则设置点击事件  if(mItemClickListener != null){holder.itemView.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {mItemClickListener.onItemClick(holder.itemView, position);}});}}@Override// 重写onCreateViewHolder方法,返回一个自定义的ViewHolderpublic MyHolder onCreateViewHolder(ViewGroup viewgroup, int i) {// 填充布局View view = LayoutInflater.from(mContext).inflate(R.layout.item, null);MyHolder holder = new MyHolder(view);return holder;}// 定义内部类继承ViewHolderclass MyHolder extends ViewHolder {private ImageView imageView;public MyHolder(View view) {super(view);imageView = (ImageView) view.findViewById(R.id.iv_item);}}}

效果如下:

这里写图片描述

4.自定义RecyclerView实现滚动时内容联动

例子3:RecyclerView制作相册效果 效果:在原工程的基础上进行修改,改成相册效果,即上面显示一张大图,下面的RecyclerView做为图片切换的指示器。

首先修改下布局:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"tools:context="com.example.recyclerviewdemo.MainActivity" ><ImageViewandroid:id="@+id/iv_group"android:layout_width="match_parent"android:layout_height="0dp"android:layout_margin="10dp"android:layout_weight="1"android:scaleType="centerCrop"android:src="@drawable/ic_launcher" /><!--<FrameLayoutandroid:layout_width="fill_parent"android:layout_height="0dp"android:layout_weight="1" ><ImageViewandroid:id="@+id/iv_group"android:layout_width="fill_parent"android:layout_height="fill_parent"android:layout_gravity="center"android:layout_margin="10dp"android:scaleType="centerCrop"android:src="@drawable/ic_launcher" /></FrameLayout>--><com.example.recyclerviewdemo.MyRecyclerViewandroid:id="@+id/recyclerview"android:layout_width="match_parent"android:layout_height="100dp"android:layout_centerVertical="true"android:layout_gravity="bottom" /></LinearLayout>

添加一个显示大图的区域,把RecyclerView改为自己定义的。 然后看我们自定义RecyclerView的代码:

public class MyRecyclerView extends RecyclerView {private onItemScrollChangeListener mItemScrollChangeListener;private View mCurrentView;public MyRecyclerView(Context context, AttributeSet attrs) {super(context, attrs);// TODO Auto-generated constructor stub}// 回调的接口public interface onItemScrollChangeListener {void onChange(View view, int position);}// 对外暴露设置滚动接口的方法public void setOnItemScrollChangeListener(onItemScrollChangeListener itemScrollChangeListener) {this.mItemScrollChangeListener = itemScrollChangeListener;}@Overrideprotected void onLayout(boolean changed, int l, int t, int r, int b) {// TODO Auto-generated method stubsuper.onLayout(changed, l, t, r, b);mCurrentView = getChildAt(0);if (mItemScrollChangeListener != null) {mItemScrollChangeListener.onChange(mCurrentView,getChildPosition(mCurrentView));}}@Overridepublic boolean onTouchEvent(MotionEvent e) {// TODO Auto-generated method stubif (e.getAction() == MotionEvent.ACTION_MOVE) {mCurrentView = getChildAt(0);if (mItemScrollChangeListener != null) {mItemScrollChangeListener.onChange(mCurrentView,getChildPosition(mCurrentView));}}return super.onTouchEvent(e);}
}

最主要是重写onLayout,onTouchEvent方法,并设置滚动监听的回调,还有向外界暴露监听器的逻辑。

然后是Adapter的代码

public class MyRecyclerAdapter extends Adapter<MyRecyclerAdapter.MyHolder> {private Context mContext;private List<Integer> mDatas;//private OnItemClickListener mItemClickListener;public MyRecyclerAdapter(Context context, List<Integer> datas) {super();this.mContext = context;this.mDatas = datas;}/*//item的回调接口public interface OnItemClickListener{void onItemClick(View view,int Position);}//定义一个设置点击监听器的方法public void setOnItemClickListener(OnItemClickListener itemClickListener) {this.mItemClickListener = itemClickListener;}*/@Overridepublic int getItemCount() {// TODO Auto-generated method stubreturn mDatas.size();}@Override// 填充onCreateViewHolder方法返回的holder中的控件public void onBindViewHolder(final MyHolder holder, final int position) {// TODO Auto-generated method stubholder.imageView.setImageResource(mDatas.get(position));/*//如果设置了回调,则设置点击事件  if(mItemClickListener != null){holder.itemView.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {mItemClickListener.onItemClick(holder.itemView, position);}});}*/}@Override// 重写onCreateViewHolder方法,返回一个自定义的ViewHolderpublic MyHolder onCreateViewHolder(ViewGroup viewgroup, int i) {// 填充布局View view = LayoutInflater.from(mContext).inflate(R.layout.item, null);MyHolder holder = new MyHolder(view);return holder;}// 定义内部类继承ViewHolderclass MyHolder extends ViewHolder {private ImageView imageView;public MyHolder(View view) {super(view);imageView = (ImageView) view.findViewById(R.id.iv_item);}}}

定义了一个滚动时回调的接口,然后在onTouchEvent中,监听ACTION_MOVE,用户手指滑动时,不断把当前第一个View回调回去 关于为什么getChildAt(0)和getChildPosition()可用,起初我以为有getFirstVisibleItem这个方法,后来发现么有;但是发现了getRecycledViewPool()看名字我觉得是Viewholder那个缓存队列,我想那么直接取这个队列的第一个不就是我要的View么,后来没有成功。我就观察它内部的View,最后发现,第一个显示的始终是它第一个child,至于getChildPosition这个看方法就看出来了。 效果如下:

这里写图片描述

5.RecyclerView实现瀑布流

例子4:用RecyclerView打造瀑布流效果 其中大部分内容实现和基本的RecyclerView使用是一样的,就不多叙述了,就一个地方不同,就是我们在适配器中绑定ViewHolder的方法中需要重新给我们的itemView布局设置height,这里是生成随机数来设置高度的。

//得到随机item的高度private void getRandomHeight(List<Integer> datas) {heights = new ArrayList<Integer>();for (int i = 0; i < datas.size(); i++) {heights.add((int) (200+Math.random()*100));}}

在onBindViewHolder方法中:

@Override// 填充onCreateViewHolder方法返回的holder中的控件public void onBindViewHolder(final MyHolder holder, int position) {// TODO Auto-generated method stub	//得到item的LayoutParams布局参数ViewGroup.LayoutParams params= holder.itemView.getLayoutParams();//把随机的高度赋予item布局params.height = heights.get(position);//把params设置给item布局holder.itemView.setLayoutParams(params);//为控件绑定数据holder.imageView.setImageResource(mDatas.get(position));//如果设置了监听那么它就不为空,然后回调相应的方法if(onItemClickListener!=null){holder.itemView.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {//得到当前点击item的位置posint position = holder.getLayoutPosition();//把事件交给我们实现的接口那里处理onItemClickListener.onOnItemClick(holder.itemView, position);}});holder.itemView.setOnLongClickListener(new OnLongClickListener() {@Overridepublic boolean onLongClick(View v) {//得到当前点击item的位置posint position = holder.getLayoutPosition();//把事件交给我们实现的接口那里处理onItemClickListener.onOnItemClick(holder.itemView, position);return true;}});}}

最后附上项目完整代码:

public class MainActivity extends ActionBarActivity {private RecyclerView mRecyclerView;private List<Integer> mDatas;private MyRecyclerAdapter adapter;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);initData();// 得到控件mRecyclerView = (RecyclerView) findViewById(R.id.recyclerview);mRecyclerView.setItemAnimator(new DefaultItemAnimator());//设置RecyclerView布局管理器为2列垂直排布StaggeredGridLayoutManager layoutManager = new StaggeredGridLayoutManager(3, StaggeredGridLayoutManager.VERTICAL);mRecyclerView.setLayoutManager(layoutManager);adapter = new MyRecyclerAdapter(this, mDatas);mRecyclerView.setAdapter(adapter);adapter.setOnItemClickListener(new onItemClickListener() {@Overridepublic void onOnItemClick(View view, int position) {// TODO Auto-generated method stubToast.makeText(MainActivity.this, "点击了:"+position, Toast.LENGTH_SHORT).show();}@Overridepublic void onLongClick(View view, int position) {//长按删除mDatas.remove(position);adapter.notifyItemRemoved(position);}});}private void initData() {mDatas = new ArrayList<Integer>(Arrays.asList(R.drawable.kenan1,R.drawable.kenan2, R.drawable.kenan3, R.drawable.kenan4,R.drawable.kenan5, R.drawable.kenan6, R.drawable.kenan7,R.drawable.kenan8,R.drawable.kenan1,R.drawable.kenan2, R.drawable.kenan3, R.drawable.kenan4));}
}
public class MyRecyclerAdapter extends Adapter<MyRecyclerAdapter.MyHolder> {private Context mContext;private List<Integer> mDatas;private List<Integer> heights;private onItemClickListener onItemClickListener;public MyRecyclerAdapter(Context context, List<Integer> datas) {super();this.mContext = context;this.mDatas = datas;getRandomHeight(this.mDatas);}public interface onItemClickListener{//条目被点击时触发的回调void onOnItemClick(View view,int position);//长按时触发的回调void onLongClick(View view,int position);}public void setOnItemClickListener(onItemClickListener onItemClickListener) {this.onItemClickListener = onItemClickListener;}@Overridepublic int getItemCount() {// TODO Auto-generated method stubreturn mDatas.size();}@Override// 填充onCreateViewHolder方法返回的holder中的控件public void onBindViewHolder(final MyHolder holder, int position) {// TODO Auto-generated method stub	//得到item的LayoutParams布局参数ViewGroup.LayoutParams params= holder.itemView.getLayoutParams();//把随机的高度赋予item布局params.height = heights.get(position);//把params设置给item布局holder.itemView.setLayoutParams(params);//为控件绑定数据holder.imageView.setImageResource(mDatas.get(position));//如果设置了监听那么它就不为空,然后回调相应的方法if(onItemClickListener!=null){holder.itemView.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {//得到当前点击item的位置posint position = holder.getLayoutPosition();//把事件交给我们实现的接口那里处理onItemClickListener.onOnItemClick(holder.itemView, position);}});holder.itemView.setOnLongClickListener(new OnLongClickListener() {@Overridepublic boolean onLongClick(View v) {//得到当前点击item的位置posint position = holder.getLayoutPosition();//把事件交给我们实现的接口那里处理onItemClickListener.onOnItemClick(holder.itemView, position);return true;}});}}@Override// 重写onCreateViewHolder方法,返回一个自定义的ViewHolderpublic MyHolder onCreateViewHolder(ViewGroup viewGroup, int arg1) {// 填充布局View view = LayoutInflater.from(mContext).inflate(R.layout.item,viewGroup, false);MyHolder holder = new MyHolder(view);return holder;}// 定义内部类继承ViewHolderclass MyHolder extends ViewHolder {private ImageView imageView;public MyHolder(View view) {super(view);imageView = (ImageView) view.findViewById(R.id.iv_item);}}//得到随机item的高度private void getRandomHeight(List<Integer> datas) {heights = new ArrayList<Integer>();for (int i = 0; i < datas.size(); i++) {heights.add((int) (200+Math.random()*100));}}
}

更多Android进阶指南 可以扫码 解锁 《Android十大板块文档》

1.Android车载应用开发系统学习指南(附项目实战)

2.Android Framework学习指南,助力成为系统级开发高手

3.2023最新Android中高级面试题汇总+解析,告别零offer

4.企业级Android音视频开发学习路线+项目实战(附源码)

5.Android Jetpack从入门到精通,构建高质量UI界面

6.Flutter技术解析与实战,跨平台首要之选

7.Kotlin从入门到实战,全方面提升架构基础

8.高级Android插件化与组件化(含实战教程和源码)

9.Android 性能优化实战+360°全方面性能调优

10.Android零基础入门到精通,高手进阶之路

敲代码不易,关注一下吧。ღ( ´・ᴗ・` ) 🤔

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

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

相关文章

C#,数值计算——分类与推理Svmpolykernel的计算方法与源程序

1 文本格式 using System; namespace Legalsoft.Truffer { public class Svmpolykernel : Svmgenkernel { public int n { get; set; } public double a { get; set; } public double b { get; set; } public double d { get; set; …

故障诊断模型 | Maltab实现LSTM长短期记忆神经网络故障诊断

文章目录 效果一览文章概述模型描述源码设计参考资料效果一览 文章概述 故障诊断模型 | Maltab实现LSTM长短期记忆神经网络故障诊断 模型描述 长短记忆神经网络——通常称作LSTM,是一种特殊的RNN,能够学习长的依赖关系。 他们由Hochreiter&Schmidhuber引入,并被许多人进行了…

美妆造型教培服务预约小程序的作用是什么

美业市场规模很高&#xff0c;细分类目更是比较广&#xff0c;而美妆造型就是其中的一类&#xff0c;从业者也比较多&#xff0c;除了学校科目外&#xff0c;美妆造型教培机构也有生意。 对机构来说主要目的是拓客引流-转化及赋能&#xff0c;而想要完善路径却是不太容易&…

机器人的触发条件有什么区别,如何巧妙的使用

简介​ 维格机器人触发条件,分为3个,分别是: 有新表单提交时、有记录满足条件时、有新的记录创建时 。 看似3个,其实是能够满足我们非常多的使用场景。 本篇将先介绍3个条件的触发条件,然后再列举一些复杂的触发条件如何用现有的触发条件来满足 注意: 维格机器人所有的…

剖析C语言中的自定义类型(结构体、枚举常量、联合)兼内存对齐与位段

目录 前言 一、结构体 1. 基本定义与使用 2. 内存对齐 3. 自定义对齐数 4. 函数传参 二、位段 三、枚举 四、联合&#xff08;共同体&#xff09; 总结​​​​​​​ 前言 本篇博客将介绍C语言中的结构体&#xff08;struct&#xff09;、枚举&#xff08;enum&…

【Redis】高并发分布式结构服务器

文章目录 服务端高并发分布式结构名词基本概念评价指标1.单机架构缺点 2.应用数据分离架构应用服务集群架构读写分离/主从分离架构引入缓存-冷热分离架构分库分表&#xff08;垂直分库&#xff09;业务拆分⸺微服务 总结 服务端高并发分布式结构 名词基本概念 应⽤&#xff0…

【错误解决方案】ModuleNotFoundError: No module named ‘ngboost‘

1. 错误提示 在python程序&#xff0c;尝试导入一个名为ngboost的模块&#xff0c;但Python提示找不到这个模块。 错误提示&#xff1a;ModuleNotFoundError: No module named ‘ngboost‘ 2. 解决方案 出现上述问题&#xff0c;可能是因为你还没有安装这个模块&#xff0c;…

了解Docker的文件系统网络模式的基本原理

Docker文件系统 Linux基础 一个Linux系统运行需要两个文件系统&#xff1a; bootfs rbootfs bootfs&#xff08;boot file system&#xff09; bootfs 即引导文件系统&#xff0c;Linux内核启动时使用的文件系统。对于同样的内核版本的不同Lunx发行版本&#xff0c;其boot…

百度富文本上传图片后样式崩塌

&#x1f525;博客主页&#xff1a; 破浪前进 &#x1f516;系列专栏&#xff1a; Vue、React、PHP ❤️感谢大家点赞&#x1f44d;收藏⭐评论✍️ 问题描述&#xff1a;上传图片后&#xff0c;图片会变得很大&#xff0c;当点击的时候更是会顶开整个的容器的高跟宽 原因&#…

C++之类型转换

目录 一、C语言中的类型转换 二、C的强制类型转换 1、 static_cast 2、reinterpret_cast 3、 const_cast 4、dynamic_cast 一、C语言中的类型转换 在C语言中&#xff0c;如果赋值运算符左右两侧类型不同&#xff0c;或者形参与实参类型不匹配&#xff0c;或者返回值类型…

idea的设置

1.设置搜索encoding,所有编码都给换为utf-8 安装插件 eval-reset插件 https://www.yuque.com/huanlema-pjnah/okuh3c/lvaoxt#m1pdA 设置活动模板,idea有两种方式集成tomcat,一种是右上角config配置本地tomcat,一种是插件,如果使用插件集成,则在maven,pom.xml里面加上tomcat…

openGauss学习笔记-110 openGauss 数据库管理-管理用户及权限-Schema

文章目录 openGauss学习笔记-110 openGauss 数据库管理-管理用户及权限-Schema110.1 创建、修改和删除Schema110.2 搜索路径 openGauss学习笔记-110 openGauss 数据库管理-管理用户及权限-Schema Schema又称作模式。通过管理Schema&#xff0c;允许多个用户使用同一数据库而不…

XML教学视频(黑马程序员精讲 XML 知识!)笔记

第一章XML概述 1.1认识XML XML数据格式&#xff1a; 不是html但又和html有点相似 XML数据格式最主要的功能就是数据传输&#xff08;一个服务器到另一个服务器&#xff0c;一个网站到另一个网站&#xff09;配置文件、储存数据当做小型数据可使用、规范数据格式让数据具有结…

多线程---synchronized特性+原理

文章目录 synchronized特性synchronized原理锁升级/锁膨胀锁消除锁粗化 synchronized特性 互斥 当某个线程执行到某个对象的synchronized中时&#xff0c;其他线程如果也执行到同一个对象的synchronized就会阻塞等待。 进入synchronized修饰的代码块相当于加锁 退出synchronize…

基于Qt 文本读写(QFile/QTextStream/QDataStream)实现

​ 在很多时候我们需要读写文本文件进行读写,比如写个 Mp3 音乐播放器需要读 Mp3 歌词里的文本,比如修改了一个 txt 文件后保存,就需要对这个文件进行读写操作。本章介绍简单的文本文件读写,内容精简,让大家了解文本读写的基本操作。 ## QFile 读写文本 QFile 类提供了读…

一个注解,实现数据脱敏-plus版

shigen坚持日更的博客写手&#xff0c;擅长Java、python、vue、shell等编程语言和各种应用程序、脚本的开发。坚持记录和分享从业两年以来的技术积累和思考&#xff0c;不断沉淀和成长。 当看到这个文章名的时候&#xff0c;是不是很熟悉&#xff0c;是的shigen之前发表了一个这…

【PC】特殊空投-2023年10月

亲爱的玩家朋友们&#xff0c;大家好&#xff01; 10月特殊空投活动来袭。本月我们也准备了超多活动等着大家来体验。快来完成任务获得丰富的奖励吧&#xff01;签到活动&#xff0c;每周一次的PUBG空投节&#xff0c;还有可以领取PGC2023免费投票劵的活动等着大家&#xff01;…

聊聊统一认证中的四种安全认证协议(干货分享)

大家好&#xff0c;我是陈哈哈。单点登录SSO的出现是为了解决众多企业面临的痛点&#xff0c;场景即用户需要登录N个程序或系统&#xff0c;每个程序与系统都有不同的用户名和密码。在企业发展初期&#xff0c;可能仅仅有几个程序时&#xff0c;管理账户和密码不是一件难事。但…

SV-10A-4G IP网络报警非可视终端 (4G版)

SV-10A-4G IP网络报警非可视终端 &#xff08;4G版&#xff09; https://item.taobao.com/item.htm?spma21dvs.23580594.0.0.621e3d0dpv5knb&ftt&id745728046948 产品简介&#xff1a; 通过局域网/广域网网组网的网络报警系统&#xff0c;改变传统局域网组网…

数据结构与算法解析(C语言版)--搭建项目环境

本栏目致力于从0开始使用纯C语言将经典算法转换成能够直接上机运行的程序&#xff0c;以项目的形式详细描述数据存储结构、算法实现和程序运行过程。 参考书目如下&#xff1a; 《数据结构C语言版-严蔚敏》 《数据结构算法解析第2版-高一凡》 软件工具&#xff1a; dev-cpp 搭…