当前位置: 首页 > news >正文

kotlin - 2个Fragment实现左右显示,左边列表,右边详情,平板横、竖屏切换

kotlin - 2个Fragment实现左右显示,左边列表,右边详情,平板横、竖屏切换

(要使用平板测试)平板横屏:左右fragment实现分屏效果,平板竖屏:只显示左边的fragment,点击才显示右边fragment
屏幕旋转,会销毁重新创建,执行onCreate方法。
在AndroidManifest.xml配置android:configChanges="screenSize|smallestScreenSize|screenLayout|orientation|keyboardHidden|navigation"属性,只调用onConfigurationChanged方法
fragment的
add方法
如果新打开一个activity,该fragment只回调onStop()方法,没有调用onDestroy()方法。
如果popBackStack或者finish,会回调onStop()和onDestroy()方法
 replace方法:旧的fragment执行onDestroy()方法,然后新建一个fragment,执行onViewCreated()方法。

package com.example.androidkotlindemo2.pad.leftrightimport android.content.Intent
import android.content.res.Configuration
import android.os.Bundle
import androidx.appcompat.app.AppCompatActivity
import com.example.androidkotlindemo2.R
import com.example.androidkotlindemo2.utils.LogUtils/*** Author : wn* Email : maoning20080809@163.com* Date : 2025/8/30 21:41* Description : (要使用平板测试)平板横屏:左右fragment实现分屏效果,平板竖屏:只显示左边的fragment,点击才显示右边fragment* 屏幕旋转,会销毁重新创建,执行onCreate方法。* 在AndroidManifest.xml配置android:configChanges="screenSize|smallestScreenSize|screenLayout|orientation|keyboardHidden|navigation"属性,只调用onConfigurationChanged方法* fragment的* add方法,*  如果新打开一个activity,该fragment只回调onStop()方法,没有调用onDestroy()方法。*  如果popBackStack或者finish,会回调onStop()和onDestroy()方法* replace:旧的fragment执行onDestroy()方法,然后新建一个fragment,执行onViewCreated()方法。*/
class LRFragmentActivity : AppCompatActivity() {//平板横屏private var isLandscape: Boolean = falseoverride fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)setContentView(R.layout.lr_fragment_main)LogUtils.d("LeftRightMainActivity onCreate");// 初始化显示列表Fragmentif (savedInstanceState == null) {supportFragmentManager.beginTransaction().replace(R.id.fragment_list_container, LRListFragment()).commit()}checkOrientation()}//检查横、竖屏private fun checkOrientation() {val orientation = resources.configuration.orientationisLandscape = orientation == Configuration.ORIENTATION_LANDSCAPE}fun setOnItemClick(position: Int, lrItem: LRItem) {if(position < 3){if(isLandscape){//平板横屏,左右显示fragmentshowItemDetailReplace(lrItem)} else {//平板竖屏,使用新的Activity显示startRightActivity(lrItem)}} else if(position < 6){//只适配平板横屏效果showItemDetailAdd(lrItem)} else {showItemNewActivity(lrItem)}}//竖屏打开新的Activityfun startRightActivity(lrItem: LRItem){val intent = Intent(this, LRRightActivity::class.java)intent.putExtra("lr_item", lrItem)startActivity(intent)}//使用replace方法fun showItemDetailReplace(lrItem: LRItem) {val detailFragment = LRDetailReplaceFragment.newInstance(lrItem)supportFragmentManager.beginTransaction().replace(R.id.fragment_detail_container, detailFragment).commit()}//使用add方法, 只回调onStop方法,不回调onDestroy方法fun showItemDetailAdd(LRItem: LRItem) {val detailNewFragment = LRDetailAddFragment.newInstance(LRItem)supportFragmentManager.beginTransaction().add(R.id.fragment_detail_container, detailNewFragment).addToBackStack("detail_new_fragment") // 添加这行才能popBackStack回退.commit()}//屏幕旋转,移除fragmentfun removeDetailFragment(){val detailFragment = supportFragmentManager.findFragmentById(R.id.fragment_detail_container)if(detailFragment != null){supportFragmentManager.beginTransaction().remove(detailFragment).commit()}}//使用add方法, 只回调onStop方法,不回调onDestroy方法fun showItemNewActivity(LRItem: LRItem) {startActivity(Intent(this, LRNewActivity::class.java))}override fun onConfigurationChanged(newConfig: Configuration) {super.onConfigurationChanged(newConfig)LogUtils.i("LeftRightMainActivity onConfigurationChanged");checkOrientation()removeDetailFragment()}override fun onStop() {super.onStop()LogUtils.d("LeftRightMainActivity onDestroy")}override fun onDestroy() {super.onDestroy()LogUtils.d("LeftRightMainActivity onDestroy")}override fun onNewIntent(intent: Intent?) {super.onNewIntent(intent)LogUtils.i("LeftRightMainActivity onNewIntent")}}

package com.example.androidkotlindemo2.pad.leftrightimport android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.fragment.app.Fragment
import androidx.recyclerview.widget.DividerItemDecoration
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
import com.example.androidkotlindemo2.R
import com.example.androidkotlindemo2.utils.LogUtils/*** Author : wn* Email : maoning20080809@163.com* Date : 2025/8/30 21:41* Description :*/
class LRListFragment : Fragment(){private lateinit var recyclerView: RecyclerViewprivate lateinit var adapter: LRAdapterprivate var LRItemList = mutableListOf<LRItem>()override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?,savedInstanceState: Bundle?): View? {return inflater.inflate(R.layout.lr_fragment_item_list, container, false)}override fun onViewCreated(view: View, savedInstanceState: Bundle?) {super.onViewCreated(view, savedInstanceState)setupRecyclerView(view)loadItems()}private fun setupRecyclerView(view: View) {recyclerView = view.findViewById(R.id.recycler_view)adapter = LRAdapter(LRItemList, object : LROnItemClickInter{override fun setOnItemClick(position: Int, lrItem: LRItem) {// 通知Activity显示详情(activity as? LRFragmentActivity)?.setOnItemClick(position,lrItem)}override fun setOnLongClickListener(position: Int, lrItem: LRItem) {LogUtils.i("长按:${position}")}})recyclerView.layoutManager = LinearLayoutManager(requireContext())recyclerView.adapter = adapterrecyclerView.addItemDecoration(DividerItemDecoration(requireContext(), LinearLayoutManager.VERTICAL))}private fun loadItems() {for(i in 1 .. 20){LRItemList.add(LRItem(i, "项目${i}", "这是第${i}个项目的详细描述"))}adapter.notifyDataSetChanged()}
}

package com.example.androidkotlindemo2.pad.leftrightimport android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.Button
import android.widget.TextView
import androidx.core.content.ContextCompat
import androidx.fragment.app.Fragment
import com.example.androidkotlindemo2.MyApp
import com.example.androidkotlindemo2.R
import com.example.androidkotlindemo2.utils.LogUtils/*** Author : wn* Email : maoning20080809@163.com* Date : 2025/8/30 21:45* Description : 新的详情,使用fragment的add方法调用,只会调用onStop()*/
class LRDetailAddFragment : Fragment() {companion object {private const val ARG_ITEM = "item"fun newInstance(LRItem: LRItem): LRDetailAddFragment {val fragment = LRDetailAddFragment()val args = Bundle().apply {putParcelable(ARG_ITEM, LRItem)}fragment.arguments = argsreturn fragment}}override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?,savedInstanceState: Bundle?): View? {return inflater.inflate(R.layout.lr_fragment_item_detail, container, false)}override fun onViewCreated(view: View, savedInstanceState: Bundle?) {super.onViewCreated(view, savedInstanceState)LogUtils.w("LRDetailAddFragment onViewCreated ----------------------------")LogUtils.w("LRDetailAddFragment onViewCreated()  ${this}")arguments?.getParcelable<LRItem>(ARG_ITEM)?.let { item ->displayItemDetails(view, item)}view.findViewById<Button>(R.id.lr_item_details_back).visibility = View.VISIBLE//返回view.findViewById<Button>(R.id.lr_item_details_back).setOnClickListener {LogUtils.i("LRDetailNewFragment返回")requireActivity().supportFragmentManager.popBackStack()}view.findViewById<Button>(R.id.lr_item_details_finish).visibility = View.VISIBLE//关闭 -view.findViewById<Button>(R.id.lr_item_details_finish).setOnClickListener {LogUtils.i("LRDetailNewFragment关闭")requireActivity().finish()}}override fun onStart() {super.onStart()LogUtils.w("LRDetailAddFragment onStart() ${this}")}override fun onResume() {super.onResume()LogUtils.w("LRDetailAddFragment onResume() ${this}")}override fun onPause() {super.onPause()LogUtils.w("LRDetailAddFragment onPause() ${this}")}override fun onStop() {super.onStop()LogUtils.w("LRDetailAddFragment onStop() ${this}")}override fun onDestroy() {super.onDestroy()LogUtils.w("LRDetailAddFragment onDestroy()  ${this}")}private fun displayItemDetails(view: View, LRItem: LRItem) {view.findViewById<TextView>(R.id.title_text_view).text = LRItem.titleview.findViewById<TextView>(R.id.description_text_view).text = "新页面:" + LRItem.descriptionview.findViewById<TextView>(R.id.description_text_view).setTextColor(ContextCompat.getColor(MyApp.myApp,R.color.blue))view.findViewById<TextView>(R.id.description_text_view).setTextSize(30f)}
}

package com.example.androidkotlindemo2.pad.leftrightimport android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.Button
import android.widget.TextView
import androidx.fragment.app.Fragment
import com.example.androidkotlindemo2.R
import com.example.androidkotlindemo2.utils.LogUtils/*** Author : wn* Email : maoning20080809@163.com* Date : 2025/8/30 21:45* Description : 使用replace方法,会调用onStop()和onDestroy()方法,*/
class LRDetailReplaceFragment : Fragment() {companion object {private const val ARG_ITEM = "item"fun newInstance(LRItem: LRItem): LRDetailReplaceFragment {val fragment = LRDetailReplaceFragment()val args = Bundle().apply {putParcelable(ARG_ITEM, LRItem)}fragment.arguments = argsreturn fragment}}override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?,savedInstanceState: Bundle?): View? {return inflater.inflate(R.layout.lr_fragment_item_detail, container, false)}override fun onViewCreated(view: View, savedInstanceState: Bundle?) {super.onViewCreated(view, savedInstanceState)LogUtils.i("LRDetailReplaceFragment onViewCreated ----------------------------")LogUtils.d("LRDetailReplaceFragment onViewCreated()  ${this}")arguments?.getParcelable<LRItem>(ARG_ITEM)?.let { item ->displayItemDetails(view, item)}//返回view.findViewById<Button>(R.id.lr_item_details_back).visibility = View.GONEview.findViewById<Button>(R.id.lr_item_details_finish).visibility = View.GONE}override fun onStart() {super.onStart()LogUtils.d("LRDetailReplaceFragment onStart()  ${this}")}override fun onResume() {super.onResume()LogUtils.d("LRDetailReplaceFragment onResume()  ${this}")}override fun onPause() {super.onPause()LogUtils.d("LRDetailReplaceFragment onPause()  ${this}")}override fun onStop() {super.onStop()LogUtils.d("LRDetailReplaceFragment onStop()  ${this}")}override fun onDestroy() {super.onDestroy()LogUtils.d("LRDetailReplaceFragment onDestroy()  ${this}")}private fun displayItemDetails(view: View, LRItem: LRItem) {view.findViewById<TextView>(R.id.title_text_view).text = LRItem.titleview.findViewById<TextView>(R.id.description_text_view).text = LRItem.description}
}

package com.example.androidkotlindemo2.pad.leftrightimport android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.LinearLayout
import android.widget.TextView
import androidx.cardview.widget.CardView
import androidx.core.content.ContextCompat
import androidx.recyclerview.widget.RecyclerView
import com.example.androidkotlindemo2.MyApp
import com.example.androidkotlindemo2.R/*** Author : wn* Email : maoning20080809@163.com* Date : 2025/8/30 21:42* Description :*/
class LRAdapter(private val itemList: List<LRItem>,private val listener: LROnItemClickInter
) : RecyclerView.Adapter<LRAdapter.ItemViewHolder>() {var selectedPosition = -1inner class ItemViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {val titleTextView: TextView = itemView.findViewById(R.id.title_text_view)val container: LinearLayout = itemView.findViewById(R.id.item_container)}override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder {val view = LayoutInflater.from(parent.context).inflate(R.layout.lr_fragment_item, parent, false)return ItemViewHolder(view)}override fun onBindViewHolder(holder: ItemViewHolder, position: Int) {val lrItem = itemList[position]holder.titleTextView.text = lrItem.titleholder.container.setOnClickListener {listener.setOnItemClick(position, lrItem)selectedPosition = positionnotifyDataSetChanged()}holder.container.setOnLongClickListener {listener.setOnLongClickListener(position, lrItem)true}if(selectedPosition == position){holder.container.setBackgroundColor(ContextCompat.getColor(MyApp.myApp, R.color.lr_item_selected_bg))} else {holder.container.setBackgroundColor(ContextCompat.getColor(MyApp.myApp, R.color.lr_item_default_bg))}}override fun getItemCount(): Int = itemList.size
}

package com.example.androidkotlindemo2.pad.leftrightimport android.os.Bundle
import android.widget.Button
import androidx.appcompat.app.AppCompatActivity
import com.example.androidkotlindemo2.R
import com.example.androidkotlindemo2.utils.LogUtils/*** Author : wn* Email : maoning20080809@163.com* Date : 2025/9/6 13:04* Description : 打开新的页面*/
class LRNewActivity : AppCompatActivity(){override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)setContentView(R.layout.lr_activity_new)LogUtils.e("LRNewActivity onViewCreated ----------------------------")findViewById<Button>(R.id.lr_activity_new_close).setOnClickListener {finish()}}override fun onCreateDescription(): CharSequence? {return super.onCreateDescription()}override fun onDestroy() {super.onDestroy()LogUtils.e("LRNewActivity onDestroy ----------------------------")}
}

package com.example.androidkotlindemo2.pad.leftright/*** Author : wn* Email : maoning20080809@163.com* Date : 2025/9/6 9:46* Description :*/
interface LROnItemClickInter {//点击fun setOnItemClick(position: Int, lrItem: LRItem)//长按fun setOnLongClickListener(position: Int, lrItem: LRItem)}

package com.example.androidkotlindemo2.pad.leftrightimport android.os.Bundle
import android.widget.Button
import androidx.appcompat.app.AppCompatActivity
import com.example.androidkotlindemo2.R
import com.example.androidkotlindemo2.utils.LogUtils/*** Author : wn* Email : maoning20080809@163.com* Date : 2025/9/6 13:04* Description : 在Activity中显示右边的fragment*/
class LRRightActivity : AppCompatActivity(){override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)setContentView(R.layout.lr_activity_right)val lrItem = intent.getParcelableExtra<LRItem>("lr_item") as LRItemif (savedInstanceState == null) {supportFragmentManager.beginTransaction().replace(R.id.fragment_right_container, LRDetailReplaceFragment.newInstance(lrItem)).commit()}}}

package com.example.androidkotlindemo2.pad.leftrightimport android.os.Parcel
import android.os.Parcelable
/*** Author : wn* Email : maoning20080809@163.com* Date : 2025/8/30 21:41* Description :*/
data class LRItem(val id: Int,val title: String,val description: String,val imageUrl: String? = null
) : Parcelable {constructor(parcel: Parcel) : this(parcel.readInt(),parcel.readString() ?: "",parcel.readString() ?: "",parcel.readString())override fun writeToParcel(parcel: Parcel, flags: Int) {parcel.writeInt(id)parcel.writeString(title)parcel.writeString(description)parcel.writeString(imageUrl)}override fun describeContents(): Int {return 0}companion object CREATOR : Parcelable.Creator<LRItem> {override fun createFromParcel(parcel: Parcel): LRItem {return LRItem(parcel)}override fun newArray(size: Int): Array<LRItem?> {return arrayOfNulls(size)}}
}

lr_fragment_main.xml布局
<?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"android:orientation="horizontal"android:weightSum="2"><FrameLayoutandroid:id="@+id/fragment_list_container"android:layout_width="300dp"android:layout_height="match_parent"/><TextViewandroid:layout_width="1dp"android:layout_height="match_parent"android:background="@color/blue"/><FrameLayoutandroid:id="@+id/fragment_detail_container"android:layout_width="match_parent"android:layout_height="match_parent"/></LinearLayout>

lr_fragment_item_list.xml布局
<?xml version="1.0" encoding="utf-8"?>
<androidx.recyclerview.widget.RecyclerViewxmlns:android="http://schemas.android.com/apk/res/android"android:id="@+id/recycler_view"android:layout_width="match_parent"android:layout_height="match_parent"android:padding="8dp" />

lr_fragment_item_detail.xml布局
<?xml version="1.0" encoding="utf-8"?>
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"android:background="@color/gray_e5e5e5"android:padding="16dp"><LinearLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"android:orientation="vertical"><androidx.appcompat.widget.AppCompatButtonandroid:id="@+id/lr_item_details_finish"android:layout_width="wrap_content"android:layout_height="wrap_content"android:textAllCaps="false"android:textSize="30sp"android:textColor="@color/green"android:text="关闭finish"/><androidx.appcompat.widget.AppCompatButtonandroid:id="@+id/lr_item_details_back"android:layout_width="wrap_content"android:layout_height="wrap_content"android:textAllCaps="false"android:textSize="30sp"android:textColor="@color/green"android:text="返回"/><TextViewandroid:id="@+id/title_text_view"android:layout_width="match_parent"android:layout_height="wrap_content"android:textSize="24sp"android:textStyle="bold"android:layout_marginBottom="16dp" /><TextViewandroid:id="@+id/description_text_view"android:layout_width="match_parent"android:layout_height="wrap_content"android:textSize="16sp" /><TextViewandroid:id="@+id/description_tip"android:layout_width="match_parent"android:layout_height="wrap_content"android:textColor="@color/red"android:text="1-3 使用 fragment 的 replace \n 4-6使用 fragment 的add() \n 其他使用打开activity"android:textSize="26sp" /></LinearLayout></ScrollView>

lr_fragment_item.xml布局
<?xml version="1.0" encoding="utf-8"?>
<LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"android:id="@+id/item_container"android:background="@drawable/lr_click_item_bg"android:clickable="true"android:focusable="true"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_margin="4dp"><LinearLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"android:padding="16dp"android:orientation="vertical"><TextViewandroid:id="@+id/title_text_view"android:layout_width="match_parent"android:layout_height="wrap_content"android:textSize="18sp"android:textStyle="bold" /></LinearLayout></LinearLayout>
lr_activity_new.xml布局
<?xml version="1.0" encoding="utf-8"?>
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"android:background="@color/gray_e5e5e5"android:padding="16dp"><LinearLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"android:orientation="vertical"><androidx.appcompat.widget.AppCompatButtonandroid:id="@+id/lr_activity_new_close"android:layout_width="wrap_content"android:layout_height="wrap_content"android:textAllCaps="false"android:text="关闭"/><TextViewandroid:id="@+id/title_text_view"android:layout_width="match_parent"android:layout_height="wrap_content"android:textSize="24sp"android:textStyle="bold"android:text="新的Activity"android:layout_marginBottom="16dp" /><TextViewandroid:id="@+id/description_text_view"android:layout_width="match_parent"android:layout_height="wrap_content"android:textSize="16sp" /></LinearLayout></ScrollView>

lr_activity_right.xml布局
<?xml version="1.0" encoding="utf-8"?><LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"android:background="@color/gray_e5e5e5"android:orientation="vertical"><FrameLayoutandroid:id="@+id/fragment_right_container"android:layout_width="match_parent"android:layout_height="match_parent"/>
</LinearLayout>
drawable:
lr_click_item_bg.xml
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android"><item android:drawable="@color/lr_item_selected_bg" android:state_selected="true"/><item android:drawable="@color/lr_item_selected_bg" android:state_pressed="true"/><item android:drawable="@color/lr_item_default_bg"/>
</selector>

<color name="lr_item_default_bg">#FFFFFF</color>
<color name="lr_item_selected_bg">#FF00FF</color>
<activity android:name=".pad.leftright.LRFragmentActivity"
android:configChanges="screenSize|smallestScreenSize|screenLayout|orientation|keyboardHidden|navigation"/>
<activity android:name=".pad.leftright.LRNewActivity"/>
<activity android:name=".pad.leftright.LRRightActivity"/>


文章转载自:

http://SNtCvnGU.rdLfk.cn
http://MZbYqGNV.rdLfk.cn
http://gu89HikI.rdLfk.cn
http://6KnZADvL.rdLfk.cn
http://2tOUmh7n.rdLfk.cn
http://27Llr6zd.rdLfk.cn
http://jhla1egY.rdLfk.cn
http://N4Kjy8L6.rdLfk.cn
http://rl8IHuJY.rdLfk.cn
http://QrgsVCkl.rdLfk.cn
http://8S9bOXKc.rdLfk.cn
http://Uhi2sS6p.rdLfk.cn
http://7atDI9h3.rdLfk.cn
http://FvwmI7Pp.rdLfk.cn
http://iZEIthmV.rdLfk.cn
http://U5WcPlkA.rdLfk.cn
http://yOBde3Ih.rdLfk.cn
http://i7goWvc6.rdLfk.cn
http://Uh0GWS8a.rdLfk.cn
http://uuQlJpbC.rdLfk.cn
http://pSIEuNlP.rdLfk.cn
http://pW4FgKKo.rdLfk.cn
http://G8Ir7Uzg.rdLfk.cn
http://I5ukjnyf.rdLfk.cn
http://libdgPvV.rdLfk.cn
http://MMJsx4td.rdLfk.cn
http://ZLbQbHl3.rdLfk.cn
http://nvvqJ2nr.rdLfk.cn
http://uHHWpkvE.rdLfk.cn
http://pjzkG7pg.rdLfk.cn
http://www.dtcms.com/a/370100.html

相关文章:

  • 基于SpringBoot+Thymeleaf开发的实验室助理工作管理系统
  • 手写MyBatis第53弹: @Intercepts与@Signature注解的工作原理
  • 基于SpringBoot+JSP开发的潮鞋网络商城
  • docker run 命令,不接it选项,run一个centos没有显示在运行,而run一个nginx却可以呢?
  • 【C++框架#3】Etcd 安装使用
  • 洛谷 P3178 [HAOI2015] 树上操作-提高+/省选-
  • Java全栈开发工程师的面试实战:从基础到复杂场景的技术探索
  • 【Flask】测试平台开发,重构提测管理页面-第二十篇
  • ICPC 2023 Nanjing R L 题 Elevator
  • TensorFlow 面试题及详细答案 120道(101-110)-- 底层原理与扩展
  • 《sklearn机器学习——聚类性能指标》Davies-Bouldin Index (戴维斯-博尔丁指数)
  • 美团9-6:编程题
  • 深度学习--自然语言预处理--- Word2Vec
  • Nikto 漏洞扫描工具使用指南
  • Redis(46) 如何搭建Redis哨兵?
  • Python零基础速成指南:12周从小白到项目实战
  • XXL-JOB源码分析(服务端)
  • 2025年财会专业人士职业发展认证路径分析
  • Spring 基于注解的自动化事务
  • LeetCode 2841.几乎唯一子数组的最大和
  • qt ElaWidgetTools添加Page页面
  • simd学习
  • 【Linux指南】动静态库与链接机制:从原理到实践
  • 分布式通信平台测试报告
  • LeetCode算法日记 - Day 33: 最长公共前缀、最长回文子串
  • 能发弹幕的简单视频网站
  • 【开题答辩全过程】以 基于Hadoop电商数据的可视化分析为例,包含答辩的问题和答案
  • 苍穹外卖优化-续
  • vi中的常用快捷键
  • 如何使显示器在笔记本盖上盖子时还能正常运转