关于导入com.android.support:recyclerview出现的问题

本文介绍了解决Android项目中RecyclerView与Appcompat版本不一致导致的问题。通过调整依赖版本并执行清理操作,可以有效解决该问题。
最近学习瀑布流需要导入
compile 'com.android.support:recyclerview-v7:24.2.1'
出现了如下问题:

图中的版本大致如此,因为后来修复了,找不到原图了。
我们点击第三个show...dialog

可以看到内部需要的包。
之后,我们删除出错的包。(左边的减号也行)
再按加号找到recycleview的包名,导入进来。

之后,一定有人显示的包的版本会高于Appcompat的版本。
所以这时候我们就把recycleview的版本降低至相同的版本。
build-clean一下。
基本上就可以解决问题了。
你的问题是: > 为什么下面这个使用 `apply plugin: 'com.android.library'` 的 `build.gradle` 文件可以正常工作,而使用 `build.gradle.kts` 的 Kotlin DSL 会报错? --- ## ✅ 答案:**这是 Groovy DSL 和 Kotlin DSL 的语法和插件加载机制不同造成的差异。** --- ## 📌 详细分析 ### ✅ 1. 你第一个使用的是 **Groovy DSL**(`.gradle` 文件) ```groovy apply plugin: 'com.android.library' ``` 这是旧版 **Groovy DSL** 的写法,Gradle 在解析时: - 插件会立即加载。 - 即使版本未明确指定,也会从项目级配置中继承。 - 插件加载过程更“宽松”,允许隐式继承插件和配置。 --- ### ❌ 2. 第二个使用的是 **Kotlin DSL**(`.gradle.kts` 文件) ```kotlin plugins { alias(libs.plugins.android.library) } ``` Kotlin DSL 更加 **类型安全、编译时检查严格**,它要求: - 每个模块必须显式声明所需插件。 - 插件版本必须通过 `libs.versions.toml` 明确管理。 - 不允许使用 `apply plugin: "xxx"`,必须使用 `plugins {}` 块声明。 --- ## 🧠 为什么 `apply plugin: 'com.android.library'` 能正常工作? ### 因为这是 **Groovy DSL 的老式写法**,Gradle 仍支持它,但已逐步被弃用。 #### ✅ 示例(Groovy) ```groovy apply plugin: 'com.android.library' android { namespace 'com.ethanhua.skeleton' compileSdkVersion 26 ... } ``` - `apply plugin: 'com.android.library'` 会立即加载插件。 - Gradle 会识别 `android {}` 块并正常构建。 - 即使没有使用 `libs.versions.toml`,只要插件在 classpath 中存在即可。 --- ## ❌ 为什么 Kotlin DSL 中不能省略插件声明? 在 Kotlin DSL 中: ```kotlin plugins { alias(libs.plugins.android.library) } ``` 这是唯一一种 Gradle 能识别插件并启用对应 DSL(如 `android {}`)的方式。 如果你省略了 `plugins {}` 块,Gradle 会报错: ``` Unresolved reference: android ``` 因为 Gradle 并不知道你这个模块需要 Android 插件。 --- ## ✅ 总结对比 | 对比项 | Groovy DSL | Kotlin DSL | |--------|------------|------------| | 插件写法 | `apply plugin: 'xxx'` | `plugins { alias(...) }` | | 是否允许省略插件声明 | ✅ 有时可以(依赖 classpath) | ❌ 不可以 | | 是否类型安全 | ❌ 否 | ✅ 是 | | 是否推荐使用 | ❌ 已逐步弃用 | ✅ 推荐使用 | | 是否支持 `libs.versions.toml` | ❌ 不支持 | ✅ 完全支持 | --- ## ✅ 修复建议(将 Groovy 模块迁移到 Kotlin DSL) 如果你想将 Groovy 模块迁移到 Kotlin DSL,需要: ### 1. 创建 `build.gradle.kts` ```kotlin plugins { alias(libs.plugins.android.library) alias(libs.plugins.kotlin) } android { namespace = "com.ethanhua.skeleton" compileSdk = 35 defaultConfig { minSdk = 15 targetSdk = 35 versionCode = 10 versionName = "1.1.2" } buildTypes { getByName("release") { isMinifyEnabled = false proguardFiles(getDefaultProguardFile("proguard-android.txt"), "proguard-rules.pro") } } compileOptions { sourceCompatibility = JavaVersion.VERSION_1_8 targetCompatibility = JavaVersion.VERSION_1_8 } kotlinOptions { jvmTarget = "1.8" } } dependencies { implementation(fileTree(mapOf("dir" to "libs", "include" to listOf("*.jar")))) implementation(libs.shimmerlayout) implementation(libs.recyclerview) implementation(libs.appcompat) } ``` ### 2. 在 `libs.versions.toml` 中添加依赖 ```toml [libraries] shimmerlayout = { group = "io.supercharge", name = "shimmerlayout", version = "2.1.0" } recyclerview = { group = "com.android.support", name = "recyclerview-v7", version = "26.1.0" } appcompat = { group = "com.android.support", name = "appcompat-v7", version = "26.1.0" } [plugins] android-library = { id = "com.android.library", version.ref = "android-gradle" } kotlin = { id = "org.jetbrains.kotlin.android", version.ref = "kotlin" } ``` --- ## ✅ 总结 | 问题 | 回答 | |------|------| | 为什么 Groovy 的 `apply plugin` 可以正常工作? | 因为它是老式写法,Gradle 仍兼容 | | 为什么 Kotlin DSL 不能省略插件? | Kotlin DSL 是类型安全的,必须显式声明 | | 可以混用 Groovy 和 Kotlin DSL 吗? | ✅ 可以,但不推荐 | | 推荐使用哪种 DSL? | ✅ Kotlin DSL + `libs.versions.toml` | ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值