【Android】高仿京东三级类型列表Demo

本demo基于二级分类双列表联动Demo进行了改进,高仿实现了京东的三级类型列表。
京东的如图:
在这里插入图片描述
本demo的:

改进之处

实现了三级列表联动,二三级列表之间的滑动监听优化了一下,将二级类型选中交予自身的点击事件,不再完全依靠三级列表的滑动回调。

上代码

引入的依赖

    //ShapeViewimplementation 'com.github.getActivity:ShapeView:9.0'//Gson解析implementation 'com.google.code.gson:gson:2.10.1'

ShapeView主要是美化一下二级条目,Gson是为了解析本地的类型json数据

条目布局

item_type_one

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:id="@+id/item_main_left_layout"android:layout_width="match_parent"android:layout_height="wrap_content"android:gravity="center"android:orientation="horizontal"android:padding="5dp"><TextViewandroid:id="@+id/type"android:layout_width="wrap_content"android:layout_height="wrap_content"android:textSize="18sp"android:layout_marginVertical="15dp" />
</LinearLayout>

item_type_two

<?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"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginTop="10dp"android:background="@color/flow"><com.hjq.shape.view.ShapeButtonandroid:id="@+id/type"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_marginHorizontal="10dp"android:gravity="center"android:paddingHorizontal="10dp"android:paddingVertical="5dp"android:textSize="18sp"app:shape_radius="10dp"app:shape_solidColor="@android:color/transparent"app:shape_strokeColor="@color/common_accent_color"app:shape_strokeSize="1dp"app:shape_textColor="@color/common_accent_color"app:shape_textPressedColor="@android:color/white"app:shape_type="rectangle" />
</LinearLayout>

item_type_three

<?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"android:layout_width="match_parent"android:layout_height="wrap_content"android:orientation="vertical"android:background="@drawable/radius_white"android:layout_margin="10dp"android:padding="10dp"><TextViewandroid:id="@+id/type"android:layout_width="wrap_content"android:layout_height="wrap_content"android:textColor="@color/black"android:paddingHorizontal="10dp"app:drawableEndCompat="@drawable/arrows_right_ic" /><androidx.recyclerview.widget.RecyclerViewandroid:id="@+id/recycler"android:layout_width="match_parent"android:layout_height="wrap_content"/>
</LinearLayout>

item_type_four(其实这个才是类型三,上面的是类型三的外围包裹,但是不想改了)

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="wrap_content"android:layout_height="wrap_content"android:background="@color/white"android:gravity="center"android:orientation="vertical"><ImageViewandroid:id="@+id/icon"android:src="@mipmap/ic_logo"android:layout_margin="5dp"android:layout_width="60dp"android:layout_height="60dp" /><TextViewandroid:id="@+id/type"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginTop="5dp"android:textSize="14sp"android:text="男鞋" />
</LinearLayout>

主页面布局

由两个列表变成了三个列表

<?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:background="@color/flow"android:orientation="horizontal"android:layout_width="match_parent"android:layout_height="match_parent"tools:context=".MainActivity"><androidx.recyclerview.widget.RecyclerViewandroid:id="@+id/one"android:layout_weight="7"android:layout_width="match_parent"android:layout_height="match_parent"/><LinearLayoutandroid:layout_weight="3"android:orientation="vertical"android:layout_width="match_parent"android:layout_height="match_parent"><androidx.recyclerview.widget.RecyclerViewandroid:id="@+id/two"android:layout_width="match_parent"android:layout_height="wrap_content"/><androidx.recyclerview.widget.RecyclerViewandroid:id="@+id/three"android:layout_weight="1"android:layout_marginTop="10dp"android:layout_width="match_parent"android:layout_height="0dp"/></LinearLayout>
</LinearLayout>

适配器

OneTypeAdapter

public class OneTypeAdapter extends RecyclerView.Adapter<OneTypeAdapter.OneTypeHolder> {private final Context context;private final List<GoodsTypeBN> list;public int selectedPosition = 0;//当前选择的下标private OnItemClickListener onItemClickListener;public OneTypeAdapter(Context context, List<GoodsTypeBN> list) {this.context = context;this.list = list;}@NonNull@Overridepublic OneTypeHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {View view= LayoutInflater.from(context).inflate(R.layout.item_type_one,parent,false);return new OneTypeHolder(view);}@Overridepublic void onBindViewHolder(@NonNull OneTypeHolder holder, @SuppressLint("RecyclerView") int position) {holder.type.setText(list.get(position).getType_name());holder.itemView.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {if (selectedPosition != holder.getAdapterPosition()) {//点击了新的 item,更新状态selectedPosition = holder.getAdapterPosition();}if (onItemClickListener!=null){onItemClickListener.onItemClickListener(v,position);}notifyDataSetChanged();}});if (position==selectedPosition){holder.type.setTextColor(context.getColor(R.color.red));holder.type.setTextSize(30);}else {holder.type.setTextColor(context.getColor(R.color.black));holder.type.setTextSize(18);}}@Overridepublic int getItemCount() {return list.size();}public static class OneTypeHolder extends RecyclerView.ViewHolder{TextView type;public OneTypeHolder(@NonNull View itemView) {super(itemView);type = itemView.findViewById(R.id.type);}}public void setOnItemClickListener(OnItemClickListener onItemClickListener) {this.onItemClickListener = onItemClickListener;}public interface OnItemClickListener {void onItemClickListener(View v, int position);}
}

TwoTypeAdapter

public class TwoTypeAdapter extends RecyclerView.Adapter<TwoTypeAdapter.TwoTypeHolder> {private Context context;private List<GoodsTypeBN> list;private OnItemClickListener onItemClickListener;public int selectPosition=0;public TwoTypeAdapter(Context context, List<GoodsTypeBN> list) {this.context = context;this.list = list;}@NonNull@Overridepublic TwoTypeHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {View view= LayoutInflater.from(context).inflate(R.layout.item_type_two,parent,false);return new TwoTypeHolder(view);}@Overridepublic void onBindViewHolder(@NonNull TwoTypeHolder holder, int position) {holder.type.setText(list.get(position).getType_name());holder.itemView.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {selectPosition=position;notifyDataSetChanged();if (onItemClickListener!=null){onItemClickListener.onItemClickListener(view,position);}}});if (position==selectPosition){holder.type.setTextColor(context.getColor(R.color.common_accent_color));holder.type.getShapeDrawableBuilder().setStrokeColor(context.getColor(R.color.common_accent_color)).intoBackground();}else {holder.type.setTextColor(context.getColor(R.color.grey));holder.type.getShapeDrawableBuilder().setStrokeColor(context.getColor(R.color.grey)).intoBackground();}}@Overridepublic int getItemCount() {return list.size();}public static class TwoTypeHolder extends RecyclerView.ViewHolder{ShapeButton type;public TwoTypeHolder(@NonNull View itemView) {super(itemView);type = itemView.findViewById(R.id.type);}}public void setOnItemClickListener(OnItemClickListener onItemClickListener) {this.onItemClickListener = onItemClickListener;}public interface OnItemClickListener {void onItemClickListener(View v, int position);}
}

注意这里,这里二级条目的点击事件下,会将自身选中,自己来选中自己,然后更新,不再交由列表的滑动来更新。
在这里插入图片描述
在这里插入图片描述

之前的是这样。因为后面的几个条目点击存在一些问题。
在这里插入图片描述

在这里插入图片描述
ThreeTypeAdapter

public class ThreeTypeAdapter extends RecyclerView.Adapter<ThreeTypeAdapter.ThreeTYpeHolder> {private final Context context;private final List<GoodsTypeBN> list;public ThreeTypeAdapter(Context context, List<GoodsTypeBN> list) {this.context = context;this.list = list;}@NonNull@Overridepublic ThreeTYpeHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {View view= LayoutInflater.from(context).inflate(R.layout.item_type_three,parent,false);return new ThreeTYpeHolder(view);}@Overridepublic void onBindViewHolder(@NonNull ThreeTYpeHolder holder, int position) {holder.type.setText(list.get(position).getType_name());holder.recyclerView.setAdapter(new FourAdapter(context,list.get(position).getNextType()));holder.recyclerView.setLayoutManager(new GridLayoutManager(context,3));}@Overridepublic int getItemCount() {return list.size();}public static class ThreeTYpeHolder extends RecyclerView.ViewHolder{TextView type;RecyclerView recyclerView;public ThreeTYpeHolder(@NonNull View itemView) {super(itemView);type = itemView.findViewById(R.id.type);recyclerView = itemView.findViewById(R.id.recycler);}}
}

FourAdapter

public class FourAdapter extends RecyclerView.Adapter<FourAdapter.FourHolder> {private final Context context;private final List<GoodsTypeBN> list;public FourAdapter( Context context,List<GoodsTypeBN> list) {this.context = context;this.list = list;}@NonNull@Overridepublic FourHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {View view= LayoutInflater.from(context).inflate(R.layout.item_type_four,parent,false);return new FourHolder(view);}@Overridepublic void onBindViewHolder(@NonNull FourHolder holder, int position) {GoodsTypeBN goodsTypeBN=list.get(position);holder.type.setText(goodsTypeBN.getType_name());holder.itemView.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {Toast.makeText(context, "点击了"+goodsTypeBN.getType_name(), Toast.LENGTH_SHORT).show();}});}@Overridepublic int getItemCount() {return list.size();}public static class FourHolder extends RecyclerView.ViewHolder{TextView type;ImageView icon;public FourHolder(@NonNull View itemView) {super(itemView);type = itemView.findViewById(R.id.type);icon = itemView.findViewById(R.id.icon);}}
}

主要代码

GoodsTypeBN类

public class GoodsTypeBN {private String type_id;private String type_name;private String parent_id;private String type_lv;private List<GoodsTypeBN> nextType;public String getType_id() {return type_id;}public void setType_id(String type_id) {this.type_id = type_id;}public String getType_name() {return type_name;}public void setType_name(String type_name) {this.type_name = type_name;}public String getParent_id() {return parent_id;}public void setParent_id(String parent_id) {this.parent_id = parent_id;}public String getType_lv() {return type_lv;}public void setType_lv(String type_lv) {this.type_lv = type_lv;}public List<GoodsTypeBN> getNextType() {return nextType;}public void setNextType(List<GoodsTypeBN> nextType) {this.nextType = nextType;}@Overridepublic String toString() {return "GoodsTypeBN{" +"type_id='" + type_id + '\'' +", type_name='" + type_name + '\'' +", parent_id='" + parent_id + '\'' +", type_lv='" + type_lv + '\'' +", nextType=" + nextType +'}';}
}

主页面逻辑

				//一级类型条目点击oneTypeAdapter.setOnItemClickListener(new OneTypeAdapter.OnItemClickListener() {@Overridepublic void onItemClickListener(View v, int position) {//更换二级三级类型的数据typeTwo.clear();typeTwo.addAll(typeOne.get(position).getNextType());twoTypeAdapter.selectPosition=0;twoTypeAdapter.notifyDataSetChanged();threeTypeAdapter.notifyDataSetChanged();}});//二级类型条目点击twoTypeAdapter.setOnItemClickListener(new TwoTypeAdapter.OnItemClickListener() {@Overridepublic void onItemClickListener(View v, int position) {//将三级类型滑动到相应位置LinearLayoutManager threeLayoutManager = ((LinearLayoutManager) three.getLayoutManager());if (threeLayoutManager!=null){threeLayoutManager.scrollToPositionWithOffset(position,0);}}});//添加三级类型滑动监听three.addOnScrollListener(onScrollListener);

添加滑动监听

RecyclerView.OnScrollListener onScrollListener = new RecyclerView.OnScrollListener() {/**获取第一个可见的item的position*/int currentPosition = 0;@Overridepublic void onScrolled(@NonNull RecyclerView recyclerView, int dx, int dy) {LinearLayoutManager twoLayoutManager = (LinearLayoutManager) two.getLayoutManager();LinearLayoutManager threeLayoutManager = ((LinearLayoutManager) three.getLayoutManager());if (twoLayoutManager!=null&&threeLayoutManager!=null){currentPosition = threeLayoutManager.findFirstCompletelyVisibleItemPosition();/**这地方需要进行判断,如果下面的Recycle在移动的时候,上面的RecyclerView也是需要进行移动的上面的recyclerview有可能会不可见,这时候,我们必须去判断一下,上面最后的一个item是不是小于下面滑动的位置,或上面第一个item是不是大于下面滑动的位置*/if (twoLayoutManager.findFirstCompletelyVisibleItemPosition() > currentPosition) {twoLayoutManager.scrollToPositionWithOffset(currentPosition, 0);} else if (twoLayoutManager.findFirstCompletelyVisibleItemPosition() < currentPosition) {twoLayoutManager.scrollToPositionWithOffset(currentPosition, 0);}// 判断滚动的方向和位置,判断是否触发了回弹效果if (dy < 0 && !recyclerView.canScrollVertically(-1)) {// 触发了上拉的回弹效果Log.e("TAG", "onScrolled: 触发了上拉的回弹效果" );} else if (dy > 0 && !recyclerView.canScrollVertically(1)) {// 触发了下拉的回弹效果currentPosition = typeTwo.size() - 1;Log.e("TAG", "onScrolled: 触发了下拉的回弹效果" );}twoTypeAdapter.selectPosition=currentPosition;twoTypeAdapter.notifyDataSetChanged();}}};

全部代码

public class MainActivity extends AppCompatActivity {private OneTypeAdapter oneTypeAdapter;private TwoTypeAdapter twoTypeAdapter;private ThreeTypeAdapter threeTypeAdapter;private List<GoodsTypeBN> typeOne;private List<GoodsTypeBN> typeTwo=new ArrayList<>();private List<GoodsTypeBN> typeThree=new ArrayList<>();private RecyclerView one,two,three;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);one=findViewById(R.id.one);two=findViewById(R.id.two);three=findViewById(R.id.three);init();}private void init(){String json = getJson(this, "category.json");if (!TextUtils.isEmpty(json)){//解析数据List<GoodsTypeBN> typeBNBaseEN=new Gson().fromJson(json, new TypeToken<List<GoodsTypeBN>>(){}.getType());if (typeBNBaseEN!=null){typeOne=typeBNBaseEN;//设置一级类型oneTypeAdapter=new OneTypeAdapter(this,typeOne);one.setLayoutManager(new LinearLayoutManager(this));one.setAdapter(oneTypeAdapter);//设置初始二级类型typeTwo.clear();typeTwo.addAll(typeOne.get(0).getNextType());twoTypeAdapter=new TwoTypeAdapter(this,typeTwo);LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this);linearLayoutManager.setOrientation(LinearLayoutManager.HORIZONTAL);two.setLayoutManager(linearLayoutManager);two.setAdapter(twoTypeAdapter);//设置初始三级类型typeThree.clear();typeThree.addAll(typeTwo.get(0).getNextType());threeTypeAdapter=new ThreeTypeAdapter(this,typeTwo);three.setLayoutManager(new LinearLayoutManager(this));three.setAdapter(threeTypeAdapter);//一级类型条目点击oneTypeAdapter.setOnItemClickListener(new OneTypeAdapter.OnItemClickListener() {@Overridepublic void onItemClickListener(View v, int position) {//更换二级三级类型的数据typeTwo.clear();typeTwo.addAll(typeOne.get(position).getNextType());twoTypeAdapter.selectPosition=0;twoTypeAdapter.notifyDataSetChanged();threeTypeAdapter.notifyDataSetChanged();}});//二级类型条目点击twoTypeAdapter.setOnItemClickListener(new TwoTypeAdapter.OnItemClickListener() {@Overridepublic void onItemClickListener(View v, int position) {//将三级类型滑动到相应位置LinearLayoutManager threeLayoutManager = ((LinearLayoutManager) three.getLayoutManager());if (threeLayoutManager!=null){threeLayoutManager.scrollToPositionWithOffset(position,0);}}});//添加三级类型滑动监听three.addOnScrollListener(onScrollListener);}}}RecyclerView.OnScrollListener onScrollListener = new RecyclerView.OnScrollListener() {/**获取第一个可见的item的position*/int currentPosition = 0;@Overridepublic void onScrolled(@NonNull RecyclerView recyclerView, int dx, int dy) {LinearLayoutManager twoLayoutManager = (LinearLayoutManager) two.getLayoutManager();LinearLayoutManager threeLayoutManager = ((LinearLayoutManager) three.getLayoutManager());if (twoLayoutManager!=null&&threeLayoutManager!=null){currentPosition = threeLayoutManager.findFirstCompletelyVisibleItemPosition();/**这地方需要进行判断,如果下面的Recycle在移动的时候,上面的RecyclerView也是需要进行移动的上面的recyclerview有可能会不可见,这时候,我们必须去判断一下,上面最后的一个item是不是小于下面滑动的位置,或上面第一个item是不是大于下面滑动的位置*/if (twoLayoutManager.findFirstCompletelyVisibleItemPosition() > currentPosition) {twoLayoutManager.scrollToPositionWithOffset(currentPosition, 0);} else if (twoLayoutManager.findFirstCompletelyVisibleItemPosition() < currentPosition) {twoLayoutManager.scrollToPositionWithOffset(currentPosition, 0);}// 判断滚动的方向和位置,判断是否触发了回弹效果if (dy < 0 && !recyclerView.canScrollVertically(-1)) {// 触发了上拉的回弹效果Log.e("TAG", "onScrolled: 触发了上拉的回弹效果" );} else if (dy > 0 && !recyclerView.canScrollVertically(1)) {// 触发了下拉的回弹效果currentPosition = typeTwo.size() - 1;Log.e("TAG", "onScrolled: 触发了下拉的回弹效果" );}twoTypeAdapter.selectPosition=currentPosition;twoTypeAdapter.notifyDataSetChanged();}}};public static String getJson(Context context, String fileName) {StringBuilder stringBuilder = new StringBuilder();//获得assets资源管理器AssetManager assetManager = context.getAssets();//使用IO流读取json文件内容try {BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(assetManager.open(fileName), StandardCharsets.UTF_8));String line;while ((line = bufferedReader.readLine()) != null) {stringBuilder.append(line);}} catch (IOException e) {e.printStackTrace();}return stringBuilder.toString();}
}

源码

github:https://github.com/panzhusheng/JDCategorydemo
gitee:https://gitee.com/pan-zs/JDCategorydemo

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

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

相关文章

IDEA如何进行远程Debug调试

背景&#xff1a; 使用docker进行CVE漏洞复现的时候&#xff0c;由于只能黑盒进行复现&#xff0c;并不能知道为什么会产生这个漏洞&#xff0c;以及漏洞的POC为什么要这么写&#xff0c;之前我都是通过本地debug来进行源码分析&#xff0c;后来搜了一下&#xff0c;发现可以进…

day36 无重叠区间 划分字母区间 合并区间

题目1&#xff1a;435 无重叠区间 题目链接&#xff1a;435 无重叠区间 题意 intervals[i][starti&#xff0c;endi] 移除区间&#xff0c;使得区间互不重叠&#xff0c;返回移除区间的最小数量 相邻区间挨在一起&#xff0c;尽量移除重叠区间 代码 class Solution { publ…

HCIP-Datacom(H12-821)81-90题解析

有需要完整题库的同学可以私信博主&#xff0c;博主看到会回复将文件发给你&#xff01;&#xff08;麻烦各位同学给博主推文点赞关注和收藏哦&#xff09; 81、在状态检测防火墙中&#xff0c;开启状态检测机制时&#xff0c;三次握手的第二个报文(SYNACK)到达防火墙的时候如…

Qt实现窗口吸附屏幕边缘 自动收缩

先看效果&#xff1a; N年前的QQ就可以吸附到屏幕边缘&#xff0c;聊天时候非常方便&#xff0c;不用点击状态栏图标即可呼出QQ界面 自己尝试做了一个糙版的屏幕吸附效果。 关键代码&#xff1a; void Widget::mouseMoveEvent(QMouseEvent *e) {int dx e->globalX() - l…

户外没有电源和网络,但需要安装监控系统,怎么办?太阳能智能监控系统给你解决

近期有粉丝给小编求助&#xff1a;需要在没网没电的户外进行智能监控的安装&#xff0c;不知道如何解决。收到粉丝的问题&#xff0c;小编立刻联系了技术人员给出方案。针对野外、户外等场景只需使用太阳能供电模组4G摄像机视频监控EasyCVR平台智能分析网关V4的架构&#xff0c…

《统计学习方法:李航》笔记 从原理到实现(基于python)-- 第5章 决策树

文章目录 第5章 决策树5.1 决策树模型与学习5.1.1 决策树模型5.1.2 决策树与if-then规则5.1.3 决策树与条件概率分布5.1.4 决策树学习5.2 特征选择5.2.1 特征选择问题5.2.2 信息增益5.2.3 信息增益比5.3.1 ID3算法5.3.2 C4.5的生成算法5.4 决策树的剪枝5.5 CART算法5.5.1 CART生…

20240202在Ubuntu20.04.6下使用whisper.cpp的CPU模式

20240202在Ubuntu20.04.6下使用whisper.cpp的CPU模式 2024/2/2 14:15 rootrootrootroot-X99-Turbo:~/whisper.cpp$ ./main -l zh -osrt -m models/ggml-medium.bin chs.wav 在纯CPU模式下&#xff0c;使用medium中等模型&#xff0c;7分钟的中文视频需要851829.69 ms&#xf…

常见的图形化编程工具都有什么

图形化编程是一种通过可视化界面和模块化组件来进行程序设计的方法&#xff0c;它使得编程更加直观和易于理解&#xff0c;尤其适合初学者和儿童学习编程。在这篇文章中&#xff0c;6547网题库将介绍图形化编程的基本概念、优势以及一些常见的图形化编程工具。 一、图形化编程的…

CAD-autolisp(三)——文件、对话框

目录 一、文件操作1.1 写文件1.2 读文件 二、对话框DCL2.1 初识对话框2.2 常用对话框界面2.2.1 复选框、列表框2.2.2 下拉框2.2.3 文字输入框、单选点框 2.3 Lisp对dcl的驱动2.4 对话框按钮实现拾取2.5 对话框加载图片2.5.1 幻灯片图片制作2.5.1 代码部分 一、文件操作 1.1 写…

密钥加密问题

C参考代码&#xff1a; #include<iostream> #include<map> #include<vector> using namespace std; int main() {vector<char> x;vector<char> y;map<char,char> word;char ch getchar();getchar();string str;getline(cin,str);for(cha…

GmSSL - GmSSL的编译、安装和命令行基本指令

文章目录 Pre下载源代码(zip)编译与安装SM4加密解密SM3摘要SM2签名及验签SM2加密及解密生成SM2根证书rootcakey.pem及CA证书cakey.pem使用CA证书签发签名证书和加密证书将签名证书和ca证书合并为服务端证书certs.pem&#xff0c;并验证查看证书内容&#xff1a; Pre Java - 一…

JDK版本如何在IDEA中切换

JDK版本在IDEA中切换 一、项目结构设置 1.Platform——Settings 项目结构---SDKS 2.Project——SDK 3.Modules——SDK——Sources 4.Modules——SDK——Dependencies 二、设置--编译--字节码版本 Settings——Build,——Java Compiler

【Servlet】——Servlet API 详解

个人主页&#xff1a;兜里有颗棉花糖 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 兜里有颗棉花糖 原创 收录于专栏【Servlet】 本专栏旨在分享学习Servlet的一点学习心得&#xff0c;欢迎大家在评论区交流讨论&#x1f48c; 目录 一、HttpServlet二、Htt…

spring boot yaml文件中如何设置duration对象值

Spring Boot对表示持续时间有专门的支持。如果您公开java.time.Duration属性&#xff0c;则应用程序对应Duration类型的属性有以下格式可用: long类型的常规表示(使用毫秒作为默认单位&#xff0c;除非指定了DurationUnit)java.time.Duration 使用的标准ISO-8601格式其中值和单…

鸿蒙ArkUI日期选择组件

鸿蒙ArkUI日期选择组件&#xff0c;基于基础组件进行的二次封装的日期选择组件&#xff0c;快速实现日期选择。 /*** 日期*/ Component export default struct DiygwDate{//绑定的值Link Watch(onValue) value:string;// 隐藏值State valueField: string value;// 显示值Sta…

6+单基因+单细胞+实验,干湿结合是生信分析发文最真诚的必杀技

今天给同学们分享一篇生信文章“CXCR4 expression is associated with proneural-to-mesenchymal transition in glioblastoma”&#xff0c;这篇文章发表在Int J Cancer期刊上&#xff0c;影响因子为6.4。 结果解读&#xff1a; CXCR4表达与PN GBM的存活和MES标记物的表达相关…

Echarts+Vue 首页大屏静态示例Demo 第三版

效果图: 源码: <template><div class="content bg" style="height: 100vh;overflow-y: auto" :class="{ fullscreen-container: isFullScreen }"><div class="reaDiv" style="height: 10vh"><div…

MySQL 5.7.36安装操作

接上文提示&#xff1a; 【Config Type】选项用于设置服务器的类型。单击该选项右侧的下三角按钮&#xff0c;即可看到 3个选项&#xff0c;如图10所示。 Development Machine&#xff08;开发者机器&#xff09;&#xff1a;代表典型的个人桌面工作站。假定机器上运行着多个…

4.java中的输入输出/输入中的next和nextLine区别问题

&#xff08;笔试会经常让我们自己去处理输入输出&#xff09; 一.输出到控制台 println 输出的内容自带 \n&#xff08;换行&#xff09; print 不带 \n printf 的格式化输出方式和 C 语言的 printf 是基本一致的. String msg "Hello, World!";System.out.print(m…

Transformer 自然语言处理(四)

原文&#xff1a;Natural Language Processing with Transformers 译者&#xff1a;飞龙 协议&#xff1a;CC BY-NC-SA 4.0 第十章&#xff1a;从头开始训练变换器 在本书的开头段落中&#xff0c;我们提到了一个名为 GitHub Copilot 的复杂应用&#xff0c;它使用类似 GPT 的…