背景
- Android Studio:
Android Studio Dolphin | 2021.3.1 Patch 1
- Gradle:
distributionUrl=https\://services.gradle.org/distributions/gradle-7.3.3-bin.zip
- AGP:
plugins {
id 'com.android.application' version '7.2.2' apply false
id 'com.android.library' version '7.2.2' apply false
id 'org.jetbrains.kotlin.android' version '1.6.10' apply false
}
問題
使用了 implementation 'com.github.CymChad:BaseRecyclerViewAdapterHelper:3.0.8',其依賴了 implementation 'androidx.recyclerview:recyclerview:1.2.1',在新建的 MyAdapter 類中調(diào)用 RecyclerView.ViewHolder#getAdapterPosition() 方法時(shí),Android Studio 提示 can not resolve method。
注意這里是不影響正常編譯和運(yùn)行的,只是 AS 的提示看著很煩人,而且不能自動(dòng)輔助彈出方法名。

解決
可以以源碼依賴的方式解決,參考 Android 依賴項(xiàng)目外部文件夾中的工程 - 簡(jiǎn)書 (jianshu.com)
實(shí)驗(yàn)
為了弄清楚什么情況下會(huì)出現(xiàn)這種情況,做了如下實(shí)驗(yàn):
新建一個(gè) Test 工程,除 app 模塊外,再建一個(gè) lib-aar 模塊和 lib-rv 模塊,其中 lib-rv 模塊模擬 RecyclerView,lib-aar 模塊模擬 BaseRecyclerViewAdapterHelper。
| - app
| - MyHolder1JavaExtendsJava.java
| - MyHolder1JavaExtendsKotlin.java
| - MyHolder1KotlinExtendsJava.kt
| - MyHolder1KotlinExtendsKotlin.kt
| - MyHolder2JavaExtendsJava.java
| - MyHolder2JavaExtendsKotlin.java
| - MyHolder2KotlinExtendsJava.kt
| - MyHolder2KotlinExtendsKotlin.kt
| - lib-aar
| - BaseHolder1Java.java
| - BaseHolder1Kotlin.kt
| - BaseHolder2Java.java
| - BaseHolder2Kotlin.kt
| - lib-rv
| - MyRecyclerView.java
| - ViewHolder2.java
| - maven
- MyRecyclerView.java
public class MyRecyclerView {
public abstract static class ViewHolder1 {
public int getAdapterPosition() {
return 0;
}
}
}
- ViewHolder2.java
public class ViewHolder2 {
public int getAdapterPosition() {
return 0;
}
}
- BaseHolder1Java.java
public class BaseHolder1Java extends MyRecyclerView.ViewHolder1 {
}
- BaseHolder1Kotlin.kt
open class BaseHolder1Kotlin : ViewHolder1() {
}
- BaseHolder2Java.java
public class BaseHolder2Java extends ViewHolder2 {
}
- BaseHolder2Kotlin.kt
open class BaseHolder2Kotlin : ViewHolder2() {
}
- MyHolder1JavaExtendsJava.java
public class MyHolder1JavaExtendsJava extends BaseHolder1Java {
public void test() {
int pos = this.getAdapterPosition();
}
}
- MyHolder1JavaExtendsKotlin.java 該文件提示
can not resolve method
public class MyHolder1JavaExtendsKotlin extends BaseHolder1Kotlin {
public void test() {
int pos = this.getAdapterPosition();
}
}
- MyHolder1KotlinExtendsJava.kt
class MyHolder1KotlinExtendsJava : BaseHolder1Java() {
fun test() {
val pos = this.getAdapterPosition()
}
}
- MyHolder1KotlinExtendsKotlin.kt
class MyHolder1KotlinExtendsKotlin : BaseHolder1Kotlin() {
fun test() {
val pos = this.getAdapterPosition()
}
}
- MyHolder2JavaExtendsJava.java
public class MyHolder2JavaExtendsJava extends BaseHolder2Java {
public void test() {
int pos = this.getAdapterPosition();
}
}
- MyHolder2JavaExtendsKotlin.java 該文正常
public class MyHolder2JavaExtendsKotlin extends BaseHolder2Kotlin {
public void test() {
int pos = this.getAdapterPosition();
}
}
- MyHolder2KotlinExtendsJava.kt
class MyHolder2KotlinExtendsJava : BaseHolder2Java() {
fun test() {
val pos = this.getAdapterPosition()
}
}
- MyHolder2KotlinExtendsKotlin.kt
class MyHolder2KotlinExtendsKotlin : BaseHolder2Kotlin() {
fun test() {
val pos = this.getAdapterPosition()
}
}
結(jié)論
通過上面的對(duì)比可以發(fā)現(xiàn),當(dāng)我們有一個(gè)類 A,其繼承自一個(gè) aar 中(說明不是源碼引用)的類 B,而類 B 又繼承自一個(gè)類 C,那么當(dāng):
- 類 A 以 java 代碼編寫
- 類 B 以 kotlin 代碼編寫且位于 aar 中
- 類 C 是一個(gè)內(nèi)部類
滿足以上三個(gè)條件時(shí),在 AS 中無(wú)法會(huì)出現(xiàn)在類 A 源碼中無(wú)法解析類 C 中的方法的情況,即類 A 中調(diào)用類 C 的方法,提示 can not resolve method。
至此,算是知道了什么情況下會(huì)出現(xiàn)該問題,也知道了如何避免該問題的方法,要么以源碼形式依賴,要么避免出現(xiàn) A(java)=>B(kotlin)=>C(內(nèi)部類) 的情況即可。
至于為什么會(huì)出現(xiàn)此問題,還需要 Google 給出原因。。。
補(bǔ)充
上面推斷出是 A(java)=>B(kotlin)=>C(內(nèi)部類) 這種情況導(dǎo)致的,于是想到再找個(gè)普通的類進(jìn)行測(cè)試,想一想哪些類中有內(nèi)部類呢,首先想到的就是 FrameLayout$LayoutParams:
- BaseLayoutParams.kt
open class BaseLayoutParams : FrameLayout.LayoutParams(0, 0) {
}
- MyLayoutParamsJava.java 不正常
public class MyLayoutParamsJava extends BaseLayoutParams {
public void test() {
int g = this.gravity;
}
}
MyLayoutParamsKotlin.kt 正常
class MyLayoutParamsKotlin : BaseLayoutParams() {
fun test() {
val g = this.gravity
}
}

果然,再次印證,當(dāng)遇到 A(java)=>B(kotlin)=>C(內(nèi)部類) 這種情況時(shí),AS 會(huì)出現(xiàn) can not resolve xxx 的 bug。