Kotlin Android开发用Volley时出现Unresolved reference: it错误如何解决
问题原因
- 你在
JsonObjectRequest的成功回调中显式声明了参数名为response,但代码里却用单参数lambda的默认隐式名it调用方法,Kotlin无法识别未定义的it变量,因此抛出Unresolved reference: it错误。 - 额外问题:当前
fetchData()方法没有返回值,你在onCreate中将它的返回值赋值给items会报错,同时Volley请求是异步逻辑,也不能直接同步返回请求结果。
解决方法
1. 修复变量引用错误
把报错行的it改成你声明的参数名response即可:
{ response -> // 把it替换为显式声明的response val newsJsonArray = response.getJSONArray("articles") }
如果你想使用默认的it,删掉显式的参数声明即可:
{ // 不写参数名时,单参数lambda默认变量名为it val newsJsonArray = it.getJSONArray("articles") }
2. 修复异步请求数据更新逻辑
Volley是异步请求,不能直接让fetchData()返回数据,需要在请求成功拿到解析后的新闻数据后,再通知适配器更新列表:
首先把列表和适配器改成类成员变量:
class MainActivity : AppCompatActivity(), NewsItemClicked { // 声明全局的新闻列表和适配器 private val newsItems = arrayListOf<String>() private lateinit var adapter: NewsListAdapter override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) recyclerView.layoutManager=LinearLayoutManager(this) // 初始化适配器 adapter= NewsListAdapter(newsItems,this) recyclerView.adapter=adapter // 发起网络请求 fetchData() }
然后在请求成功的回调里解析数据、更新列表:
{ response -> val newsJsonArray = response.getJSONArray("articles") newsItems.clear() // 遍历解析新闻标题存入列表 for(i in 0 until newsJsonArray.length()){ val newsObject = newsJsonArray.getJSONObject(i) val title = newsObject.getString("title") newsItems.add(title) } // 通知适配器数据变更,刷新列表 adapter.notifyDataSetChanged() }
注意:请求url里的API_KEY需要替换成你在NewsAPI官网申请的有效密钥,否则请求会返回失败。
内容的提问来源于stack exchange,提问作者Alok Singh
相关产品推荐
相关产品推荐

