Android view.settran,Android RecyclerView从入门到玩坏

目录

前言

基础使用

分隔线

点击监听

搭配CardView

更丰富的条目

增删条目

快速添加视图

让RecyclerView支持复杂视图

最后前言

RecyclerView在Android界面开发当中是很重要的, 那掌握它也是很必要的. 但是有些时候会觉得它很厚重, 这里就从RecyclerView的基础一直说到扩展, 让你把RecyclerView学薄了.

这篇文章融合了自己原来的多篇文章, 并进行了修正和改进, 而且添加了很多很有趣的内容.

本文需要20分钟以上的阅读时间, 请合理安排.

多图预警, 转载请注明出处!

基础使用

要使用RecyclerView在Android Studio 2.x(以下简称AS), 要这样:

compile 'com.android.support:cardview-v7:25.3.1'

compile 'com.android.support:recyclerview-v7:25.3.1'

到了AS 3.x, 要这样:

implementation 'com.android.support:cardview-v7:26.1.0'

implementation 'com.android.support:recyclerview-v7:26.1.0'

之后在布局文件中写入如下代码就引入了RecyclerView了.

android:id="@+id/rv_main"

android:layout_width="match_parent"

android:layout_height="match_parent"

android:scrollbars="vertical" />

布局类

效果LinearLayoutManager

以垂直或水平滚动列表方式显示项目

GridLayoutManager

在网格中显示项目

StaggeredGridLayoutManager

在分散对齐网格中显示项目mRvMain = (RecyclerView) findViewById(R.id.rv_main);

// 设置布局

LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this);

mRvMain.setLayoutManager(linearLayoutManager);

最关键的还是适配器的撰写. 但是理解起来不是很难, 你只要将ListView的适配器写法带入理解就好. 这里把全部代码贴出来, 因为后面要在这个基础上不断扩充.

public class MyRVAdapter2 extends RecyclerView.Adapter {

private final LayoutInflater mLayoutInflater;

private final Context mContext;

private final ArrayList mData;

public MyRVAdapter2(Context context) {

mLayoutInflater = LayoutInflater.from(context);

mContext = context;

mData = new ArrayList<>();

for (int i = 0; i < 40; i++) {

mData.add("hello " + i);

}

}

@Override

public MyRVAdapter2.MyTVHolder onCreateViewHolder(ViewGroup parent, int viewType) {

return new MyRVAdapter2.MyTVHolder(mLayoutInflater.inflate(R.layout.rv_txt_item, parent, false));

}

@Override

public void onBindViewHolder(final MyRVAdapter2.MyTVHolder holder, int pos) {

holder.mTextView.setText(mData.get(pos));

}

@Override

public int getItemCount() {

return mData == null ? 0 : mData.size();

}

class MyTVHolder extends RecyclerView.ViewHolder {

TextView mTextView;

MyTVHolder(View itemView) {

super(itemView);

mTextView = (TextView) itemView.findViewById(R.id.tv_txt);

}

}

}

然后写个最基础的TextView条目. 让它跑起来看看效果.

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:orientation="horizontal">

android:id="@+id/tv_txt"

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:gravity="center_horizontal"

android:padding="@dimen/eight_dp"

android:text="@string/tmp"

android:textSize="@dimen/thirty_sp" />

AAffA0nNPuCLAAAAAElFTkSuQmCC

分隔线

前面的部分已经是基础的RecyclerView使用了. 那比起ListView是不是没有了分隔线. 这里上一个简单好用的开源库RecyclerView-FlexibleDivider.

引入:

implementation 'com.yqritc:recyclerview-flexibledivider:1.4.0'

使用:

mRvMain.addItemDecoration(

new HorizontalDividerItemDecoration.Builder(this).build());

看效果就达到了吧.

AAffA0nNPuCLAAAAAElFTkSuQmCC

觉得不好看, 还可以自定义, 更多写法可以参见文档内容.

mRvMain.addItemDecoration(

new HorizontalDividerItemDecoration.Builder(this)

.color(Color.BLUE)

.sizeResId(R.dimen.two_dp)

.marginResId(R.dimen.eight_dp, R.dimen.eight_dp)

.build());

AAffA0nNPuCLAAAAAElFTkSuQmCC

而且而且, 竖着的分隔线也大丈夫哦.

GridLayoutManager gridLayoutManager

= new GridLayoutManager(this, 2);

mRvMain.setLayoutManager(gridLayoutManager);

mRvMain.addItemDecoration(

new VerticalDividerItemDecoration.Builder(this).build());

AAffA0nNPuCLAAAAAElFTkSuQmCC

点击监听

再回忆一下在天国的ListView, 还有item的点击吧, 这个也要自己写.

适配器中:

public interface OnItemClickListener {

void onItemClick(View view, int position);

void onItemLongClick(View view, int position);

}

private MyRVAdapter2.OnItemClickListener mOnItemClickListener;

public void setOnItemClickListener(MyRVAdapter2.OnItemClickListener mOnItemClickListener) {

this.mOnItemClickListener = mOnItemClickListener;

}

onBindViewHolder中设置点击监听.

@Override

public void onBindViewHolder(final MyRVAdapter2.MyTVHolder holder, int pos) {

holder.mTextView.setText(mData.get(pos));

if (mOnItemClickListener != null) {

holder.itemView.setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View v) {

int pos = holder.getLayoutPosition();

mOnItemClickListener.onItemClick(holder.itemView, pos);

}

});

holder.itemView.setOnLongClickListener(new View.OnLongClickListener() {

@Override

public boolean onLongClick(View v) {

int pos = holder.getLayoutPosition();

mOnItemClickListener.onItemLongClick(holder.itemView, pos);

return false;

}

});

}

}

使用监听:

mAdapter.setOnItemClickListener(new MyRVAdapter2.OnItemClickListener() {

@Override

public void onItemClick(View view, int position) {

Toast.makeText(UIUtil.getContext(), "click" + position, Toast.LENGTH_SHORT).show();

}

@Override

public void onItemLongClick(View view, int position) {

Toast.makeText(UIUtil.getContext(), "long click" + position, Toast.LENGTH_SHORT).show();

}

});

AAffA0nNPuCLAAAAAElFTkSuQmCC

搭配CardView

是不是这个点击看着没啥感觉, 没事, 我们换上CardView再来一次.

布局文件:

xmlns:card_view="http://schemas.android.com/apk/res-auto"

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:layout_margin="@dimen/eight_dp"

android:foreground="@drawable/card_foreground"

card_view:cardCornerRadius="@dimen/four_dp">

android:id="@+id/tv_txt"

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:gravity="center_horizontal"

android:padding="@dimen/eight_dp"

android:text="@string/tmp"

android:textSize="@dimen/thirty_sp" />

AAffA0nNPuCLAAAAAElFTkSuQmCC

给CardView加上水波纹点击特效:

android:color="@color/colorPrimary" />

AAffA0nNPuCLAAAAAElFTkSuQmCC

在老版本就只能用选择器了, 其实效果也还好:

android:drawable="@drawable/card_foreground_selector"

android:insetBottom="@dimen/four_dp"

android:insetLeft="@dimen/three_dp"

android:insetRight="@dimen/three_dp"

android:insetTop="@dimen/four_dp" />

AAffA0nNPuCLAAAAAElFTkSuQmCC

更丰富的条目

大家应该都知道TextView可以设置图标吧, 这里来看下效果图, 顺带感受下android界面设计语言的变化.

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:orientation="horizontal">

android:id="@+id/tv_txt"

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:drawableLeft="@mipmap/ic_launcher"

android:drawablePadding="@dimen/sixteen_dp"

android:drawableStart="@mipmap/ic_launcher"

android:gravity="center_vertical"

android:padding="@dimen/eight_dp"

android:text="@string/tmp"

android:textSize="@dimen/thirty_sp" />

AAffA0nNPuCLAAAAAElFTkSuQmCC

AAffA0nNPuCLAAAAAElFTkSuQmCC

让GridLayoutManager展示不同宽度的条目

方的是4.x上的, 圆的是8.x上的, 可以看到, 变化还是很大的. 我们回正题. GridLayoutManager布局是可以设置宽度的, 不一定都是一样大的, 来看下实现.

// 指定item宽度

gridLayoutManager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() {

@Override

public int getSpanSize(int position) {

if (position == 0

|| position == (mAdapter.getItemCount() - 1) / 2

|| position == (mAdapter.getItemCount() - 1)) {

return gridLayoutManager.getSpanCount();

} else {

return 1;

}

}

});

来看效果图, 发现我们的分隔线崩了是吧, 如果真想用这个分隔线也还是要自己动手修补修补, 改动改动, 开源库再棒也猜不到你的项目需求呀.

AAffA0nNPuCLAAAAAElFTkSuQmCC

AAffA0nNPuCLAAAAAElFTkSuQmCC

当然了, 我还是很喜欢这个分隔线的, 我们来看看横着滚动的效果.

布局文件要改动:

android:layout_width="wrap_content"

android:layout_height="match_parent"

android:orientation="horizontal">

android:id="@+id/tv_txt"

android:layout_width="wrap_content"

android:layout_height="match_parent"

android:gravity="center_vertical"

android:text="@string/tmp"

android:textSize="@dimen/thirty_sp" />

gridLayoutManager.setOrientation(GridLayoutManager.HORIZONTAL);

AAffA0nNPuCLAAAAAElFTkSuQmCC

展示不同布局

之前变化宽度其实还是相同条目, 现在要展示不同条目:

写一个图的条目:

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:padding="@dimen/eight_dp">

android:id="@+id/iv_img"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:layout_centerInParent="true"

android:class="lazyload" src="https://img-blog.csdnimg.cn/2022010702381440793.png" data-original="@mipmap/ic_launcher" />

public enum ITEM_TYPE {

ITEM_TYPE_IMAGE,

ITEM_TYPE_TEXT

}

这里多了判断条目类型, 还要注意返回值的变化, 用了更基类的RecyclerView.ViewHolder.

@Override

public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {

if (viewType == ITEM_TYPE.ITEM_TYPE_IMAGE.ordinal()) {

return new MyRVAdapter2.MyIVHolder(mLayoutInflater.inflate(R.layout.rv_img_item, parent, false));

} else {

return new MyRVAdapter2.MyTVHolder(mLayoutInflater.inflate(R.layout.rv_txt_item, parent, false));

}

}

类继承上面也要变成RecyclerView.ViewHolder, 这些都是要对应的.

extends RecyclerView.Adapter

当然了, holder也是不能少的.

public class MyIVHolder extends RecyclerView.ViewHolder {

ImageView mImageView;

MyIVHolder(View view) {

super(view);

mImageView = (ImageView) view.findViewById(R.id.iv_img);

}

}

@Override

public void onBindViewHolder(final RecyclerView.ViewHolder holder, int pos) {

if (holder instanceof MyRVAdapter2.MyTVHolder) {

((MyRVAdapter2.MyTVHolder) holder).mTextView.setText(mData.get(pos));

} else if (holder instanceof MyRVAdapter2.MyIVHolder) {

((MyRVAdapter2.MyIVHolder) holder).mImageView.setImageDrawable(UIUtil.getDrawable(R.mipmap.ic_launcher));

}

// 点击监听

...

}

顺带的, 我们把之前放宽的条目变成不同的视图, 也就是对应起来:

@Override

public int getItemViewType(int position) {

if (position == 0

|| position == (getItemCount() - 1) / 2

|| position == (getItemCount() - 1)) {

return ITEM_TYPE.ITEM_TYPE_IMAGE.ordinal();

} else {

return ITEM_TYPE.ITEM_TYPE_TEXT.ordinal();

}

}

看看效果:

AAffA0nNPuCLAAAAAElFTkSuQmCC

它还能继续地复杂, 试试瀑布流StaggeredGridLayoutManager:

xmlns:card_view="http://schemas.android.com/apk/res-auto"

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:layout_margin="@dimen/eight_dp"

card_view:cardCornerRadius="@dimen/four_dp">

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:orientation="vertical">

android:id="@+id/iv_img"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:layout_gravity="center_horizontal"

android:class="lazyload" src="https://img-blog.csdnimg.cn/2022010702381440793.png" data-original="@mipmap/ic_launcher" />

android:id="@+id/tv_txt"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:layout_gravity="center_horizontal"

android:text="@string/tmp"

android:textSize="@dimen/thirty_sp" />

StaggeredGridLayoutManager staggeredGridLayoutManager

= new StaggeredGridLayoutManager(3, StaggeredGridLayoutManager.VERTICAL);

mRvMain.setLayoutManager(staggeredGridLayoutManager);

AAffA0nNPuCLAAAAAElFTkSuQmCC

分割线又崩了, 嘿嘿, 其实用上了CardView, 分割线没什么必要再用了.

AAffA0nNPuCLAAAAAElFTkSuQmCC

增删条目

现在适配器中添加增删方法:

public void addData(int position) {

mData.add(position, "hello x");

notifyItemInserted(position);

}

public void removeData(int position) {

mData.remove(position);

notifyItemRemoved(position);

}

再写入点击事件中, 点击增加, 长按删除:

mAdapter.setOnItemClickListener(new MyRVAdapter2.OnItemClickListener() {

@Override

public void onItemClick(View view, int position) {

mAdapter.addData(position);

}

@Override

public void onItemLongClick(View view, int position) {

mAdapter.removeData(position);

}

});

AAffA0nNPuCLAAAAAElFTkSuQmCC

增删条目开源库

这里再上一个开源库recyclerview-animators, 可以修改增删动画, 种类也很丰富, 还能在它基础上自定义:

分类

动画类名Cool

LandingAnimator

Scale

ScaleInAnimator, ScaleInTopAnimator, ScaleInBottomAnimator, ScaleInLeftAnimator, ScaleInRightAnimator

Fade

FadeInAnimator, FadeInDownAnimator, FadeInUpAnimator, FadeInLeftAnimator, FadeInRightAnimator

Flip

FlipInTopXAnimator, FlipInBottomXAnimator, FlipInLeftYAnimator, FlipInRightYAnimator

Slide

SlideInLeftAnimator, SlideInRightAnimator, OvershootInLeftAnimator, OvershootInRightAnimator, SlideInUpAnimator, SlideInDownAnimator引入:

implementation 'jp.wasabeef:recyclerview-animators:2.3.0'

使用:

mRvMain.setItemAnimator(new SlideInLeftAnimator());

这里给大家展示两种效果, 其它的自己尝试吧.

AAffA0nNPuCLAAAAAElFTkSuQmCC

mRvMain.setItemAnimator(new LandingAnimator());

AAffA0nNPuCLAAAAAElFTkSuQmCC

快速添加视图

还有像Header, Foot这样的视图, 自己写也还是要费些功夫的, 这里推荐Android大神的库baseAdapter

引入:

implementation 'com.zhy:base-rvadapter:3.0.3'

添加头尾视图

HeaderAndFooterWrapper mHeaderAndFooterWrapper = new HeaderAndFooterWrapper(mAdapter);

TextView t1 = new TextView(this);

t1.setText("Header 1");

t1.setTextSize(30);

TextView t2 = new TextView(this);

t2.setText("Foot 1");

t2.setTextSize(30);

mHeaderAndFooterWrapper.addHeaderView(t1);

mHeaderAndFooterWrapper.addFootView(t2);

mRvMain.setAdapter(mHeaderAndFooterWrapper);

AAffA0nNPuCLAAAAAElFTkSuQmCC

添加更多视图

LoadMoreWrapper mLoadMoreWrapper = new LoadMoreWrapper(mAdapter);

mLoadMoreWrapper.setLoadMoreView(R.layout.rv_cv_img_txt_item);

mLoadMoreWrapper.setOnLoadMoreListener(new LoadMoreWrapper.OnLoadMoreListener() {

@Override

public void onLoadMoreRequested() {

}

});

mRvMain.setAdapter(mLoadMoreWrapper);

AAffA0nNPuCLAAAAAElFTkSuQmCC

是不是感觉特别爽, 那看看更爽的, 在不写适配器的情况下快速添加条目:

final ArrayList mData = new ArrayList<>();

for (int i = 0; i < 40; i++) {

mData.add("hello " + i);

}

mRvMain.setAdapter(new CommonAdapter(this, R.layout.rv_cv_txt_item, mData) {

@Override

protected void convert(ViewHolder holder, String s, int position) {

holder.setText(R.id.tv_txt, mData.get(position));

}

});

AAffA0nNPuCLAAAAAElFTkSuQmCC

是不是感觉省了一万个小时呢.

让RecyclerView支持复杂视图

每次加入新的视图都要对适配器进行比较大程度的改动, 这样是很容易出错的. 这里引入一个非常棒的开源库-AdapterDelegates, 降低下代码耦合性.

引入:

implementation 'com.hannesdorfmann:adapterdelegates3:3.0.1'

先不说使用细节, 来看看实现后想加入不同视图有多简单吧:

ArrayList data = new ArrayList<>();

for (int i = 0; i < 10; i++) {

data.add(new B("b " + i));

}

for (int i = 0; i < 10; i++) {

data.add(new A("a " + i));

}

BaseAdapter animalAdapter = new BaseAdapter(this, data);

mRvMain.setAdapter(animalAdapter);

AAffA0nNPuCLAAAAAElFTkSuQmCC

是不是惊了, 也就是说, 你只要实现了A, B这些视图类, 直接新建放入数组就完事了.

需要写基础适配器:

public class BaseAdapter extends RecyclerView.Adapter {

private AdapterDelegatesManager> delegatesManager;

private List items;

public BaseAdapter(Activity activity, List items) {

this.items = items;

delegatesManager = new AdapterDelegatesManager<>();

delegatesManager.addDelegate(new AAdapterDelegate(activity))

.addDelegate(new BAdapterDelegate(activity));

}

@Override

public int getItemViewType(int position) {

return delegatesManager.getItemViewType(items, position);

}

@Override

public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {

return delegatesManager.onCreateViewHolder(parent, viewType);

}

@Override

public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {

delegatesManager.onBindViewHolder(items, position, holder);

}

@Override

public int getItemCount() {

return items.size();

}

}

需要对每个类进行进行具体设置, 这里以A为例.

public class AAdapterDelegate extends AdapterDelegate> {

private LayoutInflater inflater;

public AAdapterDelegate(Activity activity) {

inflater = activity.getLayoutInflater();

}

@Override

public boolean isForViewType(@NonNull List items, int position) {

return items.get(position) instanceof A;

}

@NonNull

@Override

public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent) {

return new CatViewHolder(inflater.inflate(R.layout.rv_cv_img_txt_item, parent, false));

}

@Override

public void onBindViewHolder(@NonNull List items, int position,

@NonNull RecyclerView.ViewHolder holder, @Nullable List payloads) {

CatViewHolder vh = (CatViewHolder) holder;

A cat = (A) items.get(position);

vh.name.setText(cat.getName());

}

static class CatViewHolder extends RecyclerView.ViewHolder {

public TextView name;

public ImageView img;

public CatViewHolder(View itemView) {

super(itemView);

name = (TextView) itemView.findViewById(R.id.tv_txt);

img = (ImageView) itemView.findViewById(R.id.iv_img);

}

}

}

最后

看完这篇应该是对RecyclerView有个大体认识了, 多练习练习就会得心应手起来了. 那还是有一点, 就像分隔线库的几次不理想表现, 具体项目要求还是要具体对待, 开源库也不是万能的. 最近不是又有什么开源项目套壳事件了嘛, 别人一开源就说自己有自主产权了真的好吗? 喜欢记得点赞或者关注我哦, 有意见或者建议评论区见~

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

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

相关文章

python提取英文单词 每行显示一个_使用python对文件中的单词进行提取

由于需要使用一个纯单词组成的文件&#xff0c;在网上下载到了一个存放单词的文件&#xff0c;但是里面有中文的解释&#xff0c;那就需要做一下提取了。 文本的形式如下&#xff1a;所见即所得&#xff0c;这个文本是有规律的&#xff0c;每个单词为一行&#xff0c;紧接着下一…

微服务feignclient_搞微服务用阿里开源的 Nacos 真香啊

本文适合有 Java 基础知识的人群本文作者&#xff1a;HelloGitHub-秦人HelloGitHub 推出的《讲解开源项目》系列&#xff0c;今天给大家带来一款开源 Java 版可以实现动态服务发现&#xff0c;配置和服务管理平台——Nacos&#xff0c;它是阿里巴巴团队推出的&#xff0c;符合国…

华为mate40搭载鸿蒙,华为mate40搭载鸿蒙还是EMUI11,答案来了

原标题&#xff1a;华为mate40搭载鸿蒙还是EMUI11&#xff0c;答案来了今年秋季苹果要发布首款5G版iPhone手机iPhone12&#xff0c;搭载A14处理器首发iOS14系统。而华为也要发布新款旗舰手机华为mate40系列手机&#xff0c;搭载华为麒麟1020处理器&#xff0c;首发EMUI11系统。…

称重管理系统如何修改重量_无人值守称重系统硬件配置和作用

1. 视频监控抓拍系统软件配合设摄像头在保存数据的同时抓拍&#xff0c;防止车辆或者人为的舞弊行为2. 红外定位在地磅否的两侧各安装一对红外对射&#xff0c;通过信号线连接到开关&#xff0c;当红外的光束被阻挡时&#xff0c;红外定位系统将自动发出警告&#xff0c;禁止称…

在建工程直接费用化_威县垃圾发电在建项目被罚后续:现已整改

新京报讯(记者 李大伟)3月11日&#xff0c;针对此前因环保问题被处罚一事&#xff0c;威县垃圾发电在建项目(下称威县项目)的项目方宁夏电力建设工程公司相关负责人罗中辉表示&#xff1a;目前&#xff0c;该项目已整改完成。“所有道路上的浮土已彻底清扫&#xff0c;所有的裸…

centos 断电重启后,文件系统损坏修复

为什么80%的码农都做不了架构师&#xff1f;>>> centos 断电重启后&#xff0c;由于文件系统损坏&#xff0c;无法正常开机&#xff0c;常常出现“an error occurred during the file system check” 提示&#xff0c;就是说系统文件损坏啦&#xff0c;这时候要用f…

如何对聚类结果进行分析_如何更合理地给聚类结果贴标签——由一个挖掘学生用户的项目说开去...

”聚类一时爽&#xff0c;判断两行泪“——这是解决任何一个无监督问题时都会面临的苦恼&#xff1a;最近接到了一个无监督问题的项目——给一群无标签的结构化数据贴标签&#xff0c;随后我便立即展开了工作&#xff0c;首先开始查阅资料&#xff0c;然后把EDA(数据探索) 、特…

查看文件二进制编码_小白也能学会系列:用python文件读写代码实例!(简单案例)...

前言&#xff1a;不久之前&#xff0c;从一个.dat文件中读取波形数据&#xff0c;通过一个自编码网络进行异常检测。所以特意在此写出来&#xff0c;咱从最基础的文件读写开始吧。先说数据&#xff0c;是一个int16型的数组。说是数组&#xff0c;但是读取也并不简单。众所周知&…

stm32 ucosii消息队列 串口_STM32F1的UART4串口配置

注意是UART4&#xff0c;不是USART4在stm32中UART和USART是不相同的USART是通用同步/异步串行接收/发送器UART是通用异步收发传输器简单区分同步和异步就是看通信时需不需要对外提供时钟输出&#xff0c;我们平时用的串口通信基本都是 UART。USART支持同步模式&#xff0c;因此…

程序员微信头像_微信头像暴露了你的层次:层次越低的人,越喜欢用这些头像...

这个话题&#xff0c;原本很轻松。但往细里看&#xff0c;它背后玄机很多。许多未知理论与认知可能性&#xff0c;往往就在不为人知的拐角处。卞之琳有一首诗&#xff1a;你站在桥上看风景&#xff0c;看风景的人在楼上看你。明月装饰了你的窗子&#xff0c;你装饰了别人的梦。…

华为鸿蒙系统正式拜拜,从“哄蒙”到“鸿蒙”,现在,正式对华为鸿蒙OS说你好!...

从鸿蒙发布之初一直到现在&#xff0c;很多网友都为鸿蒙出谋划策&#xff0c;毕竟是我们自己的系统&#xff0c;而现在也确实需要一套自研的、成熟的智能操作系统了。再加上鸿蒙万物互联的这个大设想&#xff0c;大家伙确实是很兴奋&#xff0c;同时在这个时代里面&#xff0c;…

英文书《用unreal来学习c++》_用机器学习来概括《哈利波特》,四句话总结一场戏...

毒栗子 发自 凹非寺量子位 出品 | 公众号 QbitAI文章太长读不下去的时候&#xff0c;就想有个TL;DR按钮&#xff0c;用最短的时间&#xff0c;看最关键的部分。要是视频很长不想看&#xff0c;该怎么挑重点食用&#xff1f;一位叫做Sagi Shaier的程序猿&#xff0c;用机器学习给…

什么是负边沿触发_用好示波器必须学会的知识:触发方式

我们先简单回顾下什么是示波器的触发。由于信号无时无刻都在变化&#xff0c;如果一股脑的都把他们显示在示波器上&#xff0c;就会很乱&#xff0c;根本无法让我们看清楚&#xff0c;从而也就无法观察信号来解决问题。考虑到信号大多数时候都是以某种规律周期性出现的&#xf…

html placehonlder属性,HTML input placeholder 属性

HTML placeholder 属性实例 1带有 placeholder 文本的两个输入字段&#xff1a;尝试一下 placeholder 文本也可以指定颜色。实例 2带有 placeholder 文本设置颜色&#xff1a;尝试一下 浏览器支持Internet Explorer 10、Firefox、Opera、Chrome 和 Safari 支持 placeholder 属性…

python画图显示不了中文_完美解决Python matplotlib绘图时汉字显示不正常的问题

Matplotlib是一个很好的作图软件&#xff0c;但是python下默认不支持中文&#xff0c;所以需要做一些修改&#xff0c;方法如下&#xff1a; 1.在python安装目录的Lib目录下创建ch.py文件。 文件中代码为&#xff1a; 保存&#xff0c;以后通过以下代码调用&#xff1a; #-*-co…

监听一个可下拉区域的滚动监听_Flutter 实现一个悬浮的效果

知乎视频​www.zhihu.com在原来的基础布局下修改江景&#xff1a;Flutter 实现钉钉侧边栏​zhuanlan.zhihu.com修改 DTMessageScreen使用 Stack 作为容器且套 SingleChildScrollView &#xff0c;监听 controller 滚动事件再 Stack 容器中多添加一个DTMessageTopQuick&#xff…

【Hive】——函数案例

1 Hive 多字节分隔符处理 1.1 默认规则 Hive默认序列化类是LazySimpleSerDe&#xff0c;其只支持使用单字节分隔符&#xff08;char&#xff09;来加载文本数据&#xff0c;例如逗号、制表符、空格等等&#xff0c;默认的分隔符为”\001”。根据不同文件的不同分隔符&#xf…

qaxwidget传递参数到html,记一次QT使用QAxWidget打开.html文件调用显示离线百度地图不能缩放,自定义图片不能显示解决方法...

主要问题&#xff1a; 一开始用的是在线的&#xff0c;都没有什么问题&#xff0c;自定义图片均可以显示&#xff0c;可是后面试了一下离线百度地图&#xff0c;在qt中运行打开.html文件和在电脑上面直接双击打开此文件显示是有差别的&#xff0c;在qt生成的程序中&#xff0c;…

爬虫找工作要掌握什么_找爬虫工作必须掌握scrapy框架究竟什么?

十个爬虫九个python写&#xff0c;九个python爬虫全部由scrapy写。社会上在招聘爬虫工程师时&#xff0c;百分之百会需要掌握scrapy爬虫框架。但是scrapy十个什么东西你知道吗&#xff1f;什么是scrapy我们先看百科词条scrapyScrapy是我们熟知的爬虫框架&#xff0c;我们用scra…

性能计数器驱动_【Nature Sustainability】机械力驱动的摩擦电高效空气负离子发生器...

空气负离子被称为空气“维他命”&#xff0c;是一种电迁移率在1-2 cm2 V-1 S-1的小离子。就目前的科学研究表明&#xff0c;他们对空气中PM物质的净化&#xff0c;有害有机物的分解&#xff0c;以及细菌的抑制均具有重要的作用。除了自然界中在深林&#xff0c;瀑布和暴雨时产生…