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

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

改进之处

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

上代码

引入的依赖

    //ShapeView
    implementation '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">
    <TextView
        android: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.ShapeButton
        android: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">

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

    <ImageView
        android:id="@+id/icon"
        android:src="@mipmap/ic_logo"
        android:layout_margin="5dp"
        android:layout_width="60dp"
        android:layout_height="60dp" />
    <TextView
        android: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.RecyclerView
        android:id="@+id/one"
        android:layout_weight="7"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>
    <LinearLayout
        android:layout_weight="3"
        android:orientation="vertical"
        android:layout_width="match_parent"
        android:layout_height="match_parent">
        <androidx.recyclerview.widget.RecyclerView
            android:id="@+id/two"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"/>
        <androidx.recyclerview.widget.RecyclerView
            android: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
    @Override
    public OneTypeHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View view= LayoutInflater.from(context).inflate(R.layout.item_type_one,parent,false);
        return new OneTypeHolder(view);
    }

    @Override
    public void onBindViewHolder(@NonNull OneTypeHolder holder, @SuppressLint("RecyclerView") int position) {

        holder.type.setText(list.get(position).getType_name());
        holder.itemView.setOnClickListener(new View.OnClickListener() {
            @Override
            public 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);
        }
    }

    @Override
    public 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
    @Override
    public TwoTypeHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View view= LayoutInflater.from(context).inflate(R.layout.item_type_two,parent,false);
        return new TwoTypeHolder(view);
    }

    @Override
    public void onBindViewHolder(@NonNull TwoTypeHolder holder, int position) {
        holder.type.setText(list.get(position).getType_name());
        holder.itemView.setOnClickListener(new View.OnClickListener() {
            @Override
            public 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();
        }
    }

    @Override
    public 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
    @Override
    public ThreeTYpeHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View view= LayoutInflater.from(context).inflate(R.layout.item_type_three,parent,false);
        return new ThreeTYpeHolder(view);
    }

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

    @Override
    public 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
    @Override
    public FourHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View view= LayoutInflater.from(context).inflate(R.layout.item_type_four,parent,false);
        return new FourHolder(view);
    }

    @Override
    public void onBindViewHolder(@NonNull FourHolder holder, int position) {
        GoodsTypeBN goodsTypeBN=list.get(position);
        holder.type.setText(goodsTypeBN.getType_name());
        holder.itemView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Toast.makeText(context, "点击了"+goodsTypeBN.getType_name(), Toast.LENGTH_SHORT).show();
            }
        });
    }

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

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

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

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

相关文章

prometheus和alertmanager inhibit_rules抑制的使用

172.16.10.21 prometheus 172.16.10.33 altermanager 172.16.10.59 mysql服务&#xff0c;node探针以及mysql的探针 [rootk8s-node02 ~]# docker ps -a CONTAINER ID IMAGE …

asp.net core通过读取配置文件来动态生成接口

如果希望接口是每次通过配置文件生成的,这样设计一些低代码的方式来获得接口。 系统目录结构: 启动配置代码: using Microsoft.AspNetCore.Hosting; using System.Configuration; using System.Data.Entity; using Swashbuckle.AspNetCore.SwaggerGen; using System.Refle…

第94讲:MySQL主从复制过滤复制的概念以及使用

文章目录 1.主从复制过滤复制的概念2.通过从库层面实现过滤复制2.1.从库过滤复制的参数2.2.配置过滤复制2.3.验证复制的准确性 1.主从复制过滤复制的概念 在MySQL主从复制集群中&#xff0c;既可以对全库进行主从复制&#xff0c;也可以对数据库实例中的某个数据库进行主从复制…

ShardingSphere 相关实践

实现水平分表 同一个数据库&#xff0c;多个表&#xff0c;把数据分到多个表里面环境&#xff1a;spring boot 2.3.2.RELEASE create database course_db;use course_db;create table course_1 (cid bigint(20) primary key ,cname varchar(50) not null,user_id bigint(20) …

机器学习---可能近似正确(PAC)、出错界限框架

1. 计算学习理论概述 从理论上刻画了若干类型的机器学习问题中的困难和若干类型的机器学习算法的能力 这个理论要回答的问题是&#xff1a; 在什么样的条件下成功的学习是可能的&#xff1f; 在什么条件下某个特定的学习算法可保证成功运行&#xff1f; 这里考虑两种框架&…

Java后端须知的前端知识

Java后端须知的前端知识 HTML &#xff08;超文本标记语言&#xff09; W3C标准 结构&#xff1a;HTML表现&#xff1a;CSS行为&#xff1a;JavaScript 快速入门 <html><head><title></title></head><body><font color"red&q…

无人机除冰保障电网稳定运行

无人机除冰保障电网稳定运行 近日&#xff0c;受低温雨雪冰冻天气影响&#xff0c;福鼎市多条输配电线路出现不同程度覆冰。 为保障福鼎电网安全可靠运行&#xff0c;供电所员工运用无人机飞行技术&#xff0c;通过在无人机下方悬挂器具&#xff0c;将无人机飞到10千伏青坑线…

代码随想录算法训练营第二十二天 |235. 二叉搜索树的最近公共祖先,701.二叉搜索树中的插入操作,450.删除二叉搜索树中的节点(待补充)

235.二叉搜索树的最近公共祖先 1、题目链接&#xff1a;力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台 2、文章讲解&#xff1a;代码随想录 3、题目&#xff1a; 给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先。 百度百科中最近公…

序列化流 ObjectInputStream 和 ObjectOutputStream 的基本使用【 File类+IO流知识回顾④】

序列化流 ObjectInputStream 和 ObjectOutputStream 的基本使用【 File类IO流知识回顾④】 序列化流序列化和反序列化如何实现序列化ObjectOutputStreamObjectInputStream 序列化流 什么是序列化&#xff1f;如何实现序列化&#xff1f;什么是反序列化&#xff1f;需要了解的类…

使用 Python 进行自然语言处理第 3 部分:使用 Python 进行文本预处理

一、说明 文本预处理涉及许多将文本转换为干净格式的任务&#xff0c;以供进一步处理或与机器学习模型一起使用。预处理文本所需的具体步骤取决于具体数据和您手头的自然语言处理任务。 常见的预处理任务包括&#xff1a; 文本规范化——将文本转换为标准表示形式&#xff0c;…

JVM篇----第十八篇

系列文章目录 文章目录 系列文章目录前言一、什么是Java虚拟机?为什么Java被称作是“平台无关的编程语言”?二、对象分配规则三、描述一下JVM加载class文件的原理机制?前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到…

《Lua程序设计》-- 学习9

迭代器和泛型for 迭代器和闭包 迭代器&#xff08;iterator&#xff09;是一种可以让我们遍历一个集合中所有元素的代码结构。在Lua语言中&#xff0c;通常使用函数表示迭代器&#xff1a;每一次调用函数时&#xff0c;函数会返回集合中的“下一个”元素。 一个闭包就是一个…

Kotlin快速入门系列9

Kotlin对象表达式和对象声明 对象表达式 有时&#xff0c;我们想要创建一个对当前类有些许修改的对象同时又不想重新声明一个子类。如果是Java&#xff0c;可以用匿名内部类的概念来解决这个问题。kotlin的对象表达式和对象声明就是为了实现这一点(创建一个对某个类做了轻微改…

我们距离AGI还有多远

什么是AGI AGI&#xff08;人工通用智能&#xff09;是指能够像人类一样完成任何智能任务的人工智能系统。AGI的目标是创建一个全面智能的系统&#xff0c;可以解决广泛的问题并进行多种任务。这种系统能够在不同的环境中适应和学习&#xff0c;并且可以从不同的来源中获取信息…

Flink实战四_TableAPISQL

接上文&#xff1a;Flink实战三_时间语义 1、Table API和SQL是什么&#xff1f; 接下来理解下Flink的整个客户端API体系&#xff0c;Flink为流式/批量处理应用程序提供了不同级别的抽象&#xff1a; 这四层API是一个依次向上支撑的关系。 Flink API 最底层的抽象就是有状态实…

JAVA处理类似饼状图占比和100%问题,采用最大余额法

前言&#xff1a; 在做数据统计报表的时候&#xff0c;有两种方式解决占比总和达不到100%或者超过100%问题。 第一种方式是前端echart图自带的算分框架。 第二种方式是java后端取处理这个问题。 现存问题&#xff1a; 前端不通过饼状图的方式去展示各个分类的占比累加和为100%问…

CESS 激励测试网 v0.7.6 将于1月31日上线

Cumulus Encrypted Storage System (CESS) 是基于区块链的去中心化云存储网络和 CDN 网络&#xff0c;支持数据在线存储和实时共享&#xff0c;为 Web3 高频动态数据的存储和检索提供全栈解决方案。 CESS 数据价值网络是以 DePIN 理念建设的 Layer 1 基础设施&#xff0c;具有…

SAP下载word

事务代码&#xff1a;STRANS 启动转换器 步骤 1. 将参数填入模板&#xff0c;并另存为word 2003 xml文档 2.使用网页打开xml文档&#xff0c;并将xml拷贝到转换器tt:template中&#xff0c;添加参数 3.替换参数&#xff0c;部分xml可能存在错误或者跑偏根据实际情况检查修改 …

1. 两数之和(力扣LeetCode)

文章目录 1. 两数之和题目描述哈希表&#xff1a;map二分查找暴力&#xff1a;双重for循环 1. 两数之和 题目描述 给定一个整数数组 nums 和一个整数目标值 target&#xff0c;请你在该数组中找出 和为目标值 target 的那 两个 整数&#xff0c;并返回它们的数组下标。 你可…

EDTER:融合transformer的边缘检测网络

原文链接&#xff1a;EDTER 首先回顾viT部分&#xff1a; 和ViT一样&#xff0c;先把图像分割为P*P大小的patch&#xff0c;分别经过映射得到tokens&#xff1a;patch embeddings。后面也加了ViT一样的position embedding&#xff0c;得到combined embeddings。 ViT中的Tran…