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

Android应用无法显示鸡尾酒列表:TheCocktailDB API数据获取失败

问题排查与解决方案

一、API请求环节排查与修复

  1. 验证接口调用合法性
    TheCocktailDB的列表查询接口格式为https://www.thecocktaildb.com/api/json/v1/1/search.php?s={关键词},先直接在浏览器/Postman访问接口,确认返回JSON数据正常。
  2. 配置必要权限与网络规则
    • 在AndroidManifest.xml中添加网络权限:
      <uses-permission android:name="android.permission.INTERNET"/>
      
    • Android 9及以上无需额外配置(接口为HTTPS),若用明文HTTP需在application标签添加:
      android:usesCleartextTraffic="true"
      
  3. 正确实现API请求逻辑(以Retrofit+Coroutine为例)
    定义API接口与数据类:
    interface CocktailApiService {
        @GET("search.php")
        suspend fun getCocktails(@Query("s") searchTerm: String): Response<CocktailResponse>
    }
    
    data class CocktailResponse(val drinks: List<CocktailDto>?)
    data class CocktailDto(
        val idDrink: String,
        val strDrink: String,
        val strDrinkThumb: String,
        val strInstructions: String
    )
    

二、Room本地存储(Dao/Entity)环节排查与修复

  1. 修正Entity注解
    确保实体类注解正确,主键与字段映射无误:
    @Entity(tableName = "cocktails")
    data class CocktailEntity(
        @PrimaryKey val idDrink: String,
        val strDrink: String,
        val strDrinkThumb: String,
        val strInstructions: String
    )
    
  2. 完善Dao方法
    使用LiveData/Flow实现数据观察,确保插入与查询逻辑正确:
    @Dao
    interface CocktailDao {
        @Insert(onConflict = OnConflictStrategy.REPLACE)
        suspend fun insertAll(cocktails: List<CocktailEntity>)
    
        @Query("SELECT * FROM cocktails")
        fun getAllCocktails(): LiveData<List<CocktailEntity>>
    }
    
  3. 正确初始化Room数据库
    在Application类中创建单例数据库实例:
    @Database(entities = [CocktailEntity::class], version = 1)
    abstract class AppDatabase : RoomDatabase() {
        abstract fun cocktailDao(): CocktailDao
    
        companion object {
            @Volatile
            private var INSTANCE: AppDatabase? = null
    
            fun getDatabase(context: Context): AppDatabase {
                return INSTANCE ?: synchronized(this) {
                    val instance = Room.databaseBuilder(
                        context.applicationContext,
                        AppDatabase::class.java,
                        "app_database"
                    ).build()
                    INSTANCE = instance
                    instance
                }
            }
        }
    }
    

三、RecyclerView与Adapter环节排查与修复

  1. 实现正确的Adapter逻辑
    确保数据更新时通知列表刷新,绑定数据到视图:
    class CocktailAdapter : RecyclerView.Adapter<CocktailAdapter.CocktailViewHolder>() {
    
        private var cocktails = emptyList<CocktailEntity>()
    
        inner class CocktailViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
            val drinkName: TextView = itemView.findViewById(R.id.tv_drink_name)
            val drinkImage: ImageView = itemView.findViewById(R.id.iv_drink_image)
        }
    
        override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): CocktailViewHolder {
            val view = LayoutInflater.from(parent.context)
                .inflate(R.layout.item_cocktail, parent, false)
            return CocktailViewHolder(view)
        }
    
        override fun onBindViewHolder(holder: CocktailViewHolder, position: Int) {
            val current = cocktails[position]
            holder.drinkName.text = current.strDrink
            // 用Glide加载图片(需添加Glide依赖)
            Glide.with(holder.itemView.context)
                .load(current.strDrinkThumb)
                .into(holder.drinkImage)
        }
    
        override fun getItemCount(): Int = cocktails.size
    
        fun updateData(newData: List<CocktailEntity>) {
            cocktails = newData
            notifyDataSetChanged()
        }
    }
    
  2. 完成列表初始化与数据观察
    在Activity/Fragment中绑定RecyclerView,并监听数据库数据变化:
    class MainActivity : AppCompatActivity() {
    
        private lateinit var adapter: CocktailAdapter
        private lateinit var viewModel: CocktailViewModel
    
        override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
            setContentView(R.layout.activity_main)
    
            // 初始化RecyclerView
            val rv = findViewById<RecyclerView>(R.id.rv_cocktails)
            adapter = CocktailAdapter()
            rv.apply {
                this.adapter = adapter
                layoutManager = LinearLayoutManager(this@MainActivity)
            }
    
            // 初始化ViewModel并观察数据
            viewModel = ViewModelProvider(this)[CocktailViewModel::class.java]
            viewModel.cocktails.observe(this) {
                adapter.updateData(it)
            }
    
            // 触发API请求
            viewModel.fetchCocktails()
        }
    }
    

四、ViewModel层整合逻辑

class CocktailViewModel : ViewModel() {
    private val dao = AppDatabase.getDatabase(Application()).cocktailDao()
    val cocktails: LiveData<List<CocktailEntity>> = dao.getAllCocktails()

    fun fetchCocktails() {
        viewModelScope.launch {
            try {
                val apiService = Retrofit.Builder()
                    .baseUrl("https://www.thecocktaildb.com/api/json/v1/1/")
                    .addConverterFactory(GsonConverterFactory.create())
                    .build()
                    .create(CocktailApiService::class.java)

                val response = apiService.getCocktails("margarita")
                response.body()?.drinks?.let { dtoList ->
                    val entities = dtoList.map {
                        CocktailEntity(
                            it.idDrink, it.strDrink, it.strDrinkThumb, it.strInstructions
                        )
                    }
                    dao.insertAll(entities)
                }
            } catch (e: Exception) {
                e.printStackTrace()
            }
        }
    }
}

五、关键排查步骤

  1. 查看Logcat,检查是否有网络请求异常、数据库操作报错;
  2. 使用Android Studio的App Inspection工具,确认Room数据库中是否已插入数据;
  3. 检查item布局文件,确保根布局宽高设置合理(避免wrap_content导致视图不可见);
  4. 验证LiveData观察者是否正确注册,数据变化时是否触发了Adapter的updateData方法。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 22:30:58