You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

API已有数据但RecyclerView无内容的排查解决求助

问题排查与解决方案

1. 未发起网络请求且未监听数据变化

你的MainActivity没有初始化ViewModel、未调用请求方法,也没有监听ViewModel中data的变化,导致数据从未被获取或更新到RecyclerView。

修改MainActivity代码:

class MainActivity : AppCompatActivity() {

    private lateinit var binding: ActivityMainBinding
    private lateinit var adapter: RecyclerviewAdapter
    private lateinit var viewModel: APIViewModel

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        binding = ActivityMainBinding.inflate(layoutInflater)
        setContentView(binding.root)

        // 初始化RecyclerView基础配置
        binding.recyclerview.setHasFixedSize(true)
        binding.recyclerview.layoutManager = LinearLayoutManager(this)
        adapter = RecyclerviewAdapter(emptyList())
        binding.recyclerview.adapter = adapter

        // 初始化ViewModel
        viewModel = ViewModelProvider(this)[APIViewModel::class.java]

        // 监听数据变化,更新Adapter
        viewModel.data.observe(this) { dataList ->
            adapter.updateData(dataList)
        }

        // 可选:监听错误与加载状态
        viewModel.error.observe(this) { isError ->
            // 此处可添加错误提示逻辑,比如Toast
        }

        viewModel.loading.observe(this) { isLoading ->
            // 此处可添加加载显示/隐藏逻辑
        }

        // 发起数据请求
        viewModel.refreshdata()
    }
}

同时给RecyclerviewAdapter添加数据更新方法:

class RecyclerviewAdapter(private var dataList: List<Data>) : RecyclerView.Adapter<RecyclerviewAdapter.ViewHolder>() {

    // 原有的ViewHolder、onCreateViewHolder、onBindViewHolder等代码保留

    fun updateData(newData: List<Data>) {
        dataList = newData
        notifyDataSetChanged()
    }
}

2. 模拟器访问本地服务的地址错误

Android模拟器中localhost指向模拟器自身,而非你的电脑本地服务,需要替换为对应地址:

  • Android Studio自带模拟器:http://10.0.2.2:5000/
  • Genymotion模拟器:http://10.0.3.2:5000/
  • 或直接使用你的电脑局域网IP(如192.168.x.x)

修改APIService中的BASE_URL:

private val BASE_URL = "http://10.0.2.2:5000/"

3. ViewModel错误处理逻辑错误

onError中错误地将loading设为true,会导致一直显示加载状态,应改为false,同时建议打印错误信息方便排查:

override fun onError(e: Throwable) {
    error.value = true
    loading.value = false
    e.printStackTrace() // 打印错误日志
}

4. 其他必要检查

  • 确保本地服务http://localhost:5000/WeatherForeCast能正常返回数据(用浏览器/Postman测试)
  • 检查AndroidManifest.xml是否添加网络权限:
<uses-permission android:name="android.permission.INTERNET" />
  • Android 9及以上版本,需在application标签中允许明文HTTP请求:
<application
    ...
    android:usesCleartextTraffic="true">
    ...
</application>

内容的提问来源于stack exchange,提问作者birisininkodarsivi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 22:00:14