TabLayout+ViewPager实现滚动页面

目录

一、TabLayout介绍

二、TabLayout的常用属性和方法

常用属性:

 常用方法:

三、适配器介绍

(一)、PagerAdapter介绍:

(二)、FragmentPagerAdapter介绍:

(三)、FragmentStatePagerAdapter介绍:

 四、TabLayout+ViewPager例子 

 MainActivity:

MyFragmentPagerAdapter : 

MyFragmentStatePagerAdapter: 

 MyPagerAdapter :

 FirstFragment :

 activirt_main:

first_page: 

         运行结果:


一、TabLayout介绍

        TabLayout是Android Support库中的一个控件,它通常与ViewPager结合使用,用于实现多个页面的切换和导航。TabLayout通过标签页的形式展示不同的内容,用户可以通过点击标签页来切换不同的页面。

二、TabLayout的常用属性和方法

常用属性:

  1. tabMode:指定TabLayout的模式。可选值包括:fixed:固定模式,每个标签页的宽度相等。scrollable:可滚动模式,适用于较多标签页的情况。

  2. tabGravity:指定标签页在TabLayout中的对齐方式。可选值包括:fill:填充模式,将标签页平均分配在TabLayout中。center:居中模式,将标签页居中显示。start:起始模式,将标签页从起始位置开始排列。

  3. tabIndicatorColor:指定选中标签页底部指示器的颜色。

  4. tabIndicatorHeight:指定选中标签页底部指示器的高度(以像素为单位)。

  5. tabBackground:指定标签页的背景。

  6. tabTextAppearance:指定标签页的文本外观样式。可以使用自定义的样式资源。

  7. tabTextColor:指定标签页的文本颜色。

  8. tabSelectedTextColor:指定选中标签页的文本颜色。

  9. tabRippleColor:指定标签页的点击效果颜色。

  10. tabMaxWidth:指定标签页的最大宽度(以像素为单位)。

  11. tabContentStart:指定标签页内容的起始位置偏移量(以像素为单位)。

 常用方法:

1、newTab():创建一个新的标签页对象。

TabLayout.Tab tab = tabLayout.newTab();

2、addTab(Tab tab):添加一个标签页到TabLayout中。

tabLayout.addTab(tab);

3、removeTab(Tab tab):从TabLayout中移除指定的标签页。

tabLayout.removeTab(tab);

4、removeTabAt(int position):根据位置移除TabLayout中的标签页。

tabLayout.removeTabAt(position);

5、getTabCount():获取TabLayout中标签页的数量。

int count = tabLayout.getTabCount();

6、getTabAt(int position):根据位置获取TabLayout中指定的标签页。

TabLayout.Tab tab = tabLayout.getTabAt(position);

7、getSelectedTabPosition():获取当前选中的标签页的位置。

int selectedPosition = tabLayout.getSelectedTabPosition();

 8、setupWithViewPager(ViewPager viewPager):将TabLayout与ViewPager进行关联,实现标签页和页面的同步切换。

tabLayout.setupWithViewPager(viewPager);

9、setTabMode(int mode):设置TabLayout的模式,可以是TabLayout.MODE_FIXEDTabLayout.MODE_SCROLLABLE

tabLayout.setTabMode(TabLayout.MODE_FIXED);

10、setTabGravity(int gravity):设置标签页在TabLayout中的对齐方式,可以是TabLayout.GRAVITY_FILLTabLayout.GRAVITY_CENTERTabLayout.GRAVITY_START

tabLayout.setTabGravity(TabLayout.GRAVITY_FILL);

11、setOnTabSelectedListener(OnTabSelectedListener listener):设置标签页选中状态监听器,用于监听标签页的选中和取消选中事件。

tabLayout.setOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
    @Override
    public void onTabSelected(TabLayout.Tab tab) {
        // 处理选中事件
    }

    @Override
    public void onTabUnselected(TabLayout.Tab tab) {
        // 处理取消选中事件
    }

    @Override
    public void onTabReselected(TabLayout.Tab tab) {
        // 处理再次选中事件
    }
});

三、适配器介绍

(一)、PagerAdapter介绍:

        PagerAdapter是Android中的一个抽象类,用于在ViewPager中管理页面的适配器。它提供了统一的接口和方法,使得我们可以轻松地将不同的页面内容与ViewPager进行绑定并展示。

主要特点和使用方式如下:

  1. 页面管理:

    • PagerAdapter用于管理ViewPager中的页面,每个页面对应一个View。
    • 可以根据需要实现自定义的PagerAdapter来管理不同类型的页面。
  2. 常用方法:

    • instantiateItem(ViewGroup container, int position):根据position创建并返回对应页面的View对象。
    • destroyItem(ViewGroup container, int position, Object object):销毁指定位置的页面View对象。
    • getCount():返回页面的总数量。
    • isViewFromObject(View view, Object object):判断当前的View是否来自于指定的对象。
  3. 生命周期:

    • PagerAdapter会根据需要创建和销毁页面的View对象,并负责管理它们的生命周期。
    • 当某个页面不再可见时,对应的View可能会被销毁。当页面重新可见时,会重新创建对应的View对象。
  4. 数据更新:

    • 在PagerAdapter中,可以通过实现相关方法,如getItemPosition(Object object)或覆写notifyDataSetChanged()方法,实现数据的更新和重新加载页面的功能。

        PagerAdapter是一个抽象类,因此不能直接实例化,我们通常会使用其子类,如FragmentPagerAdapter或FragmentStatePagerAdapter,来管理Fragment页面。

        总之,PagerAdapter是用于在ViewPager中管理页面的抽象类,通过实现相关方法来创建、销毁和更新页面的View对象。它提供了一种灵活且可扩展的方式,使得我们能够根据需要定制自己的页面适配器。

(二)、FragmentPagerAdapter介绍:

  FragmentPagerAdapter是Android Support Library中的一个类,用于在ViewPager中展示Fragment的适配器。它继承自PagerAdapter,提供了便捷的方式来管理Fragment的展示和销毁。

使用FragmentPagerAdapter时,你需要继承该类并实现以下方法:

  1. getItem(int position):根据位置获取对应的Fragment对象。
  2. getCount():获取Fragment的数量。
  3. getPageTitle(int position):获取指定位置的Fragment的标题(用于TabLayout中展示)。
  4. instantiateItem(ViewGroup container, int position):创建指定位置的Fragment并添加到容器中。

(三)、FragmentStatePagerAdapter介绍:

        FragmentStatePagerAdapter是一个用于在ViewPager中展示Fragment的适配器,它继承自PagerAdapter类,并提供了一种管理Fragment的方式。它适用于有大量Fragment或动态数量的Fragment的场景。

主要特点和使用方式如下:

  1. Fragment管理方式:

    • FragmentStatePagerAdapter只会保留当前页面及其相邻页面的Fragment实例,而其他页面的Fragment会被销毁。这种方式可以节省内存并提高性能,特别适合于大量的Fragment或者动态数量的Fragment。
    • 当页面不再可见时,对应的Fragment可能会被销毁,但它的状态会保存下来,以便在需要时进行恢复。
  2. 常用方法:

    • getItem(int position):根据position返回对应位置的Fragment实例。
    • getCount():返回Fragment的总数量。
    • destroyItem(ViewGroup container,int position,Object object):销毁指定位置的Fragment实例。
  3. 生命周期:

    • FragmentStatePagerAdapter会根据需要创建和销毁Fragment实例,以保证内存的高效利用。
    • 当某个页面不可见时,对应的Fragment可能会被销毁,但它的状态会被保存。当页面重新可见时,会重新创建对应的Fragment实例。
  4. 数据加载和更新:

    • 在FragmentStatePagerAdapter中,可以使用getItem()方法根据position获取对应位置的Fragment实例,并在该Fragment中加载数据。
    • 当数据需要更新时,可以通过通知Fragment进行更新。

        总之,FragmentStatePagerAdapter适用于需要处理大量Fragment或动态数量的Fragment的场景。它在内存占用和性能优化方面提供了较好的支持,可以灵活管理Fragment的生命周期,并实现数据的加载和更新。

 四、TabLayout+ViewPager例子 

 MainActivity:

package com.example.viewpagerdemo;

import androidx.appcompat.app.AppCompatActivity;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentManager;
import androidx.viewpager.widget.ViewPager;

import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;

import com.google.android.material.tabs.TabLayout;

import java.util.ArrayList;
import java.util.List;
/**
 * time:2023/7/15
 * author: 敬往事一杯酒
 */
public class MainActivity extends AppCompatActivity {


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
//        initFragmentPagerAdapter();
//        initFragmentStatePagerAdapter();
        initPagerAdapter();
    }

    /**
     * 使用PagerAdapter适配器实现翻转页面
     */
    private void initPagerAdapter() {
        FragmentManager fragmentManager = getSupportFragmentManager();
        ViewPager viewPager = findViewById(R.id.view_pager);
        List<View> views = new ArrayList<>();
        views.add(getLayoutInflater().inflate(R.layout.first_page,null));
        views.add(getLayoutInflater().inflate(R.layout.second_page,null));
        views.add(getLayoutInflater().inflate(R.layout.third_page,null));
        MyPagerAdapter fragmentAdapter = new MyPagerAdapter(views);
        viewPager.setAdapter(fragmentAdapter);
        // tabLayout跟viewpager关联
        TabLayout tabLayout = findViewById(R.id.tab_layout);
        tabLayout.setupWithViewPager(viewPager);
        // 设置每个标签的图标
        tabLayout.getTabAt(0).setIcon(R.drawable.ic_launcher_background);
        tabLayout.getTabAt(1).setIcon(R.drawable.ic_launcher_background);
        tabLayout.getTabAt(2).setIcon(R.drawable.ic_launcher_background);
    }


    /**
     * 使用FragmentStatePagerAdapter适配器实现翻转页面
     */
    private void initFragmentStatePagerAdapter(){
        FragmentManager fragmentManager = getSupportFragmentManager();
        ViewPager viewPager = findViewById(R.id.view_pager);
        List<Fragment> fragments = new ArrayList<>();
        fragments.add(new FirstFragment());
        fragments.add(new secondFragment());
        fragments.add(new ThirdFragment());
        MyFragmentStatePagerAdapter fragmentAdapter = new MyFragmentStatePagerAdapter(fragmentManager,fragments);
        viewPager.setAdapter(fragmentAdapter);
        // tabLayout跟viewpager关联
        TabLayout tabLayout = findViewById(R.id.tab_layout);
        tabLayout.setupWithViewPager(viewPager);
        // 设置每个标签的图标
        tabLayout.getTabAt(0).setIcon(R.drawable.ic_launcher_background);
        tabLayout.getTabAt(1).setIcon(R.drawable.ic_launcher_background);
        tabLayout.getTabAt(2).setIcon(R.drawable.ic_launcher_background);
    }
    /**
     * 使用FragmentPagerAdapter适配器实现翻转页面
     */
    private void initFragmentPagerAdapter(){
        FragmentManager fragmentManager = getSupportFragmentManager();
        ViewPager viewPager = findViewById(R.id.view_pager);
        List<Fragment> fragments = new ArrayList<>();
        fragments.add(new FirstFragment());
        fragments.add(new secondFragment());
        fragments.add(new ThirdFragment());
        MyFragmentPagerAdapter fragmentAdapter = new MyFragmentPagerAdapter(fragmentManager,fragments);
        viewPager.setAdapter(fragmentAdapter);
        // tabLayout跟viewpager关联
        TabLayout tabLayout = findViewById(R.id.tab_layout);
        tabLayout.setupWithViewPager(viewPager);
        // 设置每个标签的图标
        tabLayout.getTabAt(0).setIcon(R.drawable.ic_launcher_background);
        tabLayout.getTabAt(1).setIcon(R.drawable.ic_launcher_background);
        tabLayout.getTabAt(2).setIcon(R.drawable.ic_launcher_background);
    }
}

MyFragmentPagerAdapter : 

package com.example.viewpagerdemo;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentManager;
import androidx.fragment.app.FragmentPagerAdapter;

import java.util.List;
/**
 * time:2023/7/15
 * author: 敬往事一杯酒
 */
public class MyFragmentPagerAdapter extends FragmentPagerAdapter {
    private List<Fragment> mFragments;
    public MyFragmentPagerAdapter(@NonNull FragmentManager fm, List<Fragment>fragmentList) {
        super(fm);
        this.mFragments = fragmentList;
    }

    @NonNull
    @Override
    public Fragment getItem(int position) {
        return mFragments.get(position);
    }

    @Override
    public int getCount() {
        return mFragments.size();
    }
    @Nullable
    @Override
    public CharSequence getPageTitle(int position) {
        // 返回每个 Fragment 的标签文本
        switch (position) {
            case 0:
                return "第一页";
            case 1:
                return "第二页";
            case 2:
                return "第三页";
            default:
                return "";
        }
}}

MyFragmentStatePagerAdapter: 

package com.example.viewpagerdemo;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentManager;
import androidx.fragment.app.FragmentStatePagerAdapter;

import java.util.List;
/**
 * time:2023/7/15
 * author: 敬往事一杯酒
 */
public class MyFragmentStatePagerAdapter extends FragmentStatePagerAdapter {
    private List<Fragment> mFragments;
    public MyFragmentStatePagerAdapter(@NonNull FragmentManager fm,List<Fragment>fragments) {
        super(fm);
        mFragments = fragments;
    }

    @NonNull
    @Override
    public Fragment getItem(int position) {
        switch (position){
            case 0:
                return new FirstFragment();
            case 1:
                return new secondFragment();
            case 2:
                return new ThirdFragment();
            default:
                return null;
        }
    }


    @Override
    public int getCount() {
        if (mFragments!=null){

            return mFragments.size();
        }else {
            return 0;
    }
    }

    @Nullable
    @Override
    public CharSequence getPageTitle(int position) {
        // 返回每个 Fragment 的标签文本
        switch (position) {
            case 0:
                return "第一页";
            case 1:
                return "第二页";
            case 2:
                return "第三页";
            default:
                return "";
        }
    }
}

 MyPagerAdapter :

package com.example.viewpagerdemo;

import android.view.View;
import android.view.ViewGroup;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.viewpager.widget.PagerAdapter;

import java.util.List;
/**
 * time:2023/7/15
 * author: 敬往事一杯酒
 */
public class MyPagerAdapter extends PagerAdapter {
    private List<View> mList;
    public MyPagerAdapter(List<View> list){
        this.mList = list;
    }
    // 返回要滑动的View的个数
    @Override
    public int getCount() {
        return mList.size();
    }
    // 创建指定位置的页面图
    @NonNull
    @Override
    public Object instantiateItem(@NonNull ViewGroup container, int position) {
        container.addView(mList.get(position));
        return mList.get(position);
    }
    // instantiateItem返回的值是否与当前视图一样
    @Override
    public boolean isViewFromObject(@NonNull View view, @NonNull Object object) {
        return view==object;
    }
    // 移除一个给定位置的页面
    @Override
    public void destroyItem(@NonNull ViewGroup container, int position, @NonNull Object object) {
        container.removeView(mList.get(position));
    }
    @Nullable
    @Override
    public CharSequence getPageTitle(int position) {
        // 返回每个 Fragment 的标签文本
        switch (position) {
            case 0:
                return "第一页";
            case 1:
                return "第二页";
            case 2:
                return "第三页";
            default:
                return "";
        }
    }
}

 FirstFragment :

package com.example.viewpagerdemo;

import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;

public class FirstFragment extends Fragment {
    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        return inflater.inflate(R.layout.first_page,container,false);
    }
}

 SecondFragmentThirdFragment代码和布局文件一样。

 activirt_main:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout 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="match_parent">
   <com.google.android.material.tabs.TabLayout
       android:id="@+id/tab_layout"
       android:layout_width="match_parent"
       android:layout_height="wrap_content"
       android:layout_alignParentBottom="false"
       app:tabGravity="fill"
       app:tabMode="fixed" />

   <androidx.viewpager.widget.ViewPager
       android:id="@+id/view_pager"
       android:layout_width="match_parent"
       android:layout_height="match_parent"
       android:layout_below="@+id/tab_layout" />



</RelativeLayout>

first_page: 

<?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">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="第一个页面"
        android:textSize="25sp"
        />
</LinearLayout>

 运行结果:

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

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

相关文章

Python结巴中文分词笔记

&#x1f4da; jieba库基本介绍 &#x1f310; jieba库概述 Jieba是一个流行的中文分词库&#xff0c;它能够将中文文本切分成词语&#xff0c;并对每个词语进行词性标注。中文分词是自然语言处理的重要步骤之一&#xff0c;它对于文本挖掘、信息检索、情感分析等任务具有重要…

Android.mk 文件使用解析

和你一起终身学习&#xff0c;这里是程序员Android 经典好文推荐&#xff0c;通过阅读本文&#xff0c;您将收获以下知识点: 一、Android.mk 简介二、Android.mk 的基本格式三、Android.mk 深入学习一四、 Android.mk 深入学习二五、 Android.mk 深入学习三六、 Android.mk 判断…

引入头文件#include <iostream>的时候发生了什么?

<iostream> namespace std {extern istream cin;extern ostream cout;extern ostream cerr;extern ostream clog;extern wistream wcin;extern wostream wcout;extern wostream wcerr;extern wostream wclog;};cin是什么&#xff1f; cin extern istream cin; The objec…

关于Windows 11 docker desktop 运行doris 容器时vm.max_map_count=2000000的设置问题

需要一个简单的测试环境&#xff0c;于是准备用docker启动一个1fe 1be的简单玩一下 如果be容器启动后再去修改 /etc/sysctl.conf sysctl -w vm.max_map_count2000000 这个参数是没用的&#xff0c;be仍然会启动失败 这时可以打开cmd wsl --list C:\Users\pc>wsl --list …

TeeChart for.NET Crack

TeeChart for.NET Crack TeeChart for.NET为各种图表需求提供了图表控件&#xff0c;包括金融、科学和统计等重要的垂直领域。它可以处理您的数据&#xff0c;在各种平台上无缝创建信息丰富、引人入胜的图表&#xff0c;包括Windows窗体、WPF、带有HTML5/Javascript渲染的ASP.N…

用户、角色、权限、菜单--数据库设计

用户角色关联表--user_role id-------------------主键 user_id------------用户ID role_id-------------角色ID create_time------创建时间 is_deleted--------状态&#xff08;0&#xff1a;未删除 1&#xff1a;删除&#xff09; 角色权限关联表--role_permission id------…

JVM回收算法(标记-清除算法, 复制算法, 标记-整理算法)

1.标记-清除算法 最基础的算法&#xff0c;分为两个阶段&#xff0c;“标记”和“清除” 原理&#xff1a; - 标记阶段&#xff1a;collector从mutator根对象开始进行遍历&#xff0c;对从mutator根对象可以访问到的对象都打上一个标识&#xff0c;一般是在对象的header中&am…

LiveGBS流媒体平台GB/T28181功能-作为上级平台对接海康大华华为宇视等下级平台监控摄像机NVR硬件执法仪等GB28181设备

LiveGBS作为上级平台对接海康大华华为宇视等下级平台监控摄像机NVR硬件执法仪等GB28181设备 1、背景说明2、部署国标平台2.1、安装使用说明2.2、服务器网络环境2.3、信令服务配置 3、监控摄像头设备接入3.1、海康GB28181接入示例3.2、大华GB28181接入示例3.3、华为IPC GB28181接…

Mybatis架构简介

文章目录 1.整体架构图2. 基础支撑层2.1 类型转换模块2.2 日志模块2.3 反射工具模块2.4 Binding 模块2.5 数据源模块2.6缓存模块2.7 解析器模块2.8 事务管理模块3. 核心处理层3.1 配置解析3.2 SQL 解析与 scripting 模块3.3 SQL 执行3.4 插件4. 接口层1.整体架构图 MyBatis 分…

程序员的自我修养(2)

目标文件的学习 1.什么是目标文件以及格式 目标文件为编译器编译后生成的文件&#xff0c;就是window下的.obj&#xff0c;linux下的.o文件。与可执行文件格式几乎一样&#xff0c;因为只是缺少链接过程。所以可执行文件&#xff0c;动态链接库&#xff0c;静态链接库&#xf…

【从零到Offer】反射那些事

什么是反射&#xff1f; ​ 反射简单来说&#xff0c;就是在代码运行期间&#xff0c;通过动态指定任意一个类&#xff0c;从而构建对象&#xff0c;并了解该类的成员变量和方法&#xff0c;甚至可以调用任意一个对象的属性和方法。以String对象为例子&#xff0c;传统构造方式…

计算机网络 - http协议 与 https协议(2)

前言 本篇介绍了构造http请求的的五种方式&#xff0c;简单的使用postman构造http请求&#xff0c;进一步了解https, 学习https的加密过程&#xff0c;了解对称密钥与非对称密钥对于加密是如何进行的&#xff0c;如有错误&#xff0c;请在评论区指正&#xff0c;让我们一起交流…

SPEC CPU 2006 在 CentOS 5.0 x86_64 古老系统测试【3】静态编译 invalid run

上篇 SPEC CPU 2006 在 CentOS 5.0 x86_64 古老系统测试【2】_hkNaruto的博客-CSDN博客 修改gcc41.cfg&#xff0c;全部添加上-static 测试指令 runspec -c gcc41.cfg -T all -n 3 -r 1 -I -i ref all 结果&#xff1a;正常运行并生成报告 invalid run Invalid SPEC CFP2006…

自学网络安全(成为黑客)

一、前言 黑客这个名字一直是伴随着互联网发展而来&#xff0c;给大家的第一印象就是很酷&#xff0c;而且技术精湛&#xff0c;在网络世界里无所不能。目前几乎所有的公司企业甚至国家相关部门都会争相高薪聘请技术精湛的黑客作为互联网机构的安全卫士&#xff0c;所以黑客也…

rapid_latex_ocr: 更快更好用的公式图像转latex工具

Rapid Latex OCR rapid_latex_ocr是一个将公式图像转为latex格式的工具。仓库中的推理代码来自修改自LaTeX-OCR&#xff0c;模型已经全部转为ONNX格式&#xff0c;并对推理代码做了精简&#xff0c;推理速度更快&#xff0c;更容易部署。仓库只有基于ONNXRuntime或者OpenVINO推…

【Linux】基础开发工具——make

文章目录 前言&#xff1a;一、认识make和makefile二、依赖关系和依赖方法三、make工作原理 前言&#xff1a; 上一期分享了在Linux下编译源代码的两个工具&#xff0c;gcc和g。每次编译源代码&#xff0c;都要输入一串很长的指令&#xff0c;这个过程显然是十分复杂&#xff…

【Go|第8期】Lorca读取HTML的三种方式

日期&#xff1a;2023年7月16日 作者&#xff1a;Commas 签名&#xff1a;(ง •_•)ง 积跬步以致千里,积小流以成江海…… 注释&#xff1a;如果您觉得有所帮助&#xff0c;帮忙点个赞&#xff0c;也可以关注我&#xff0c;我们一起成长&#xff1b;如果有不对的地方&#xf…

天天刷题-->LeetCode(最长回文子串)

个人名片&#xff1a; &#x1f405;作者简介&#xff1a;一名大二在校生&#xff0c;热爱生活&#xff0c;爱好敲码&#xff01; \ &#x1f485;个人主页 &#x1f947;&#xff1a;holy-wangle ➡系列内容&#xff1a; &#x1f5bc;️ tkinter前端窗口界面创建与优化 &…

JVM内存结构——前言

前提 1. 认识JVM&#xff0c;什么是JVM 简单来说&#xff0c;就是java程序的运行环境&#xff08;java二进制字节码的运行环境&#xff09; 1.1 JVM &#xff08;java虚拟机&#xff09;的好处 &#xff1a; 一次编写&#xff0c;到处运行的机制 &#xff08;因为java语言是跨…

残差网络(ResNet) -深度学习(Residual Networks (ResNet) – Deep Learning)

在第一个基于cnn的架构(AlexNet)赢得ImageNet 2012比赛之后&#xff0c;每个随后的获胜架构都在深度神经网络中使用更多的层来降低错误率。这适用于较少的层数&#xff0c;但当我们增加层数时&#xff0c;深度学习中会出现一个常见的问题&#xff0c;称为消失/爆炸梯度。这会导…