类型不匹配:推断的类型是 Result<List<DataItem>?> 但 List<DataItem> 是预期的

问题描述

我已经在我的 viewmodel 类中实现了 Result.Success 和 Result.Error 但我在我的 SecondActivity.kt C:\Users\Edgar\AndroidStudioProjects\GiphyAndroidApp\app\src\main\java\com\example 中遇到了以下错误\giphyandroidapp\ui\SecondActivity.kt: (52,52): 类型不匹配:推断类型是 Result 但 List 是预期的

在我的 SecondActivity.kt 下面

  package com.example.giphyandroidapp.ui
import com.example.giphyandroidapp.utils.Result
import com.example.giphyandroidapp.utils.Error
import android.content.Intent
import android.os.Bundle
import android.view.View
import android.widget.Toast
import com.example.giphyandroidapp.utils.Constants
import com.example.giphyandroidapp.viewmodel.GiphyTaskviewmodel
import com.example.giphyandroidapp.adapters.GiphyTaskAdapter

import androidx.activity.viewmodels
import androidx.appcompat.app.AppCompatActivity
import androidx.recyclerview.widget.GridLayoutManager
import com.example.giphyandroidapp.databinding.ActivitySecondBinding
import com.example.giphyandroidapp.utils.Success
import dagger.hilt.android.AndroidEntryPoint

@AndroidEntryPoint
class SecondActivity : AppCompatActivity(),View.OnClickListener {

    lateinit var binding: ActivitySecondBinding
    val viewmodel: GiphyTaskviewmodel by viewmodels()

    var text: String = ""
    lateinit var myadapter: GiphyTaskAdapter


    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        binding = ActivitySecondBinding.inflate(layoutInflater)
        setContentView(binding.root)

        val intent = intent
        if (intent.hasExtra("text")) {
            // list= intent.getParcelableArrayListExtra<Parcelable>("response")!! as List<DataItem>
            text = intent.getStringExtra("text").toString()

            if (text != null) {
                bindData()
            }
        }

        binding.getresultbtn.setonClickListener(this)
    }

    private fun bindData() {

        viewmodel.getGifsFromText(Constants.Api_Key,text,Constants.Limit)

        viewmodel.giphyresponse.observe(this,{ response ->


                when (response) {
                     is Success -> {
                        myadapter = GiphyTaskAdapter(this,response.data)
                    }
                     is  Error -> {

                    } // Handle error case
                }


                binding.imgsrecycler.apply {
                    adapter = myadapter
                    layoutManager = GridLayoutManager(this@SecondActivity,2)
                    visibility = View.VISIBLE
                }
                binding.progressBar.visibility = View.GONE
            })
        }




    override fun onClick(v: View?) {
        var mytext: String = ""
        mytext = binding.txtword.text.toString()

        if (mytext.equals("")) {
            Toast.makeText(this,"you must enter word",Toast.LENGTH_LONG).show()
        } else {


            if (text.equals(mytext)) {
                val builder = android.app.AlertDialog.Builder(this)
                builder.setTitle("Winner")
                builder.setMessage("Excellent,you win \n Play game again ?!")
                builder.setPositiveButton("Yes") { dialog,which ->
                    startActivity(Intent(this,MainActivity::class.java))
                }
                builder.setNegativeButton("No") { dialog,which ->
                    dialog.dismiss()
                }
                builder.create().show()

            } else {

                val builder = android.app.AlertDialog.Builder(this)
                builder.setTitle("Loser")
                builder.setMessage("fail,you lose \n Game over ! \n Play game again ?!")
                builder.setPositiveButton("Yes") { dialog,which ->
                    dialog.dismiss()
                }
                builder.create().show()

            }

        }
    }
}

在 GiphyAdapter.kt 下

import android.content.Context
import android.view.LayoutInflater
import android.view.ViewGroup
import androidx.recyclerview.widget.RecyclerView
import coil.load
import com.example.giphyandroidapp.databinding.ListItembinding
import com.example.giphyandroidapp.model.gifsresponse.DataItem
import com.example.giphyandroidapp.model.gifsresponse.Images
import com.example.giphyandroidapp.utils.Result

class GiphyTaskAdapter(val context: Context,val list:List<DataItem>) : RecyclerView.Adapter<GiphyTaskAdapter.GiphyTaskViewHolder>() {
    override fun onCreateViewHolder(parent: ViewGroup,viewType: Int): GiphyTaskAdapter.GiphyTaskViewHolder {
        return GiphyTaskViewHolder(ListItembinding.inflate(LayoutInflater.from(parent.context),parent,false))
    }

    override fun onBindViewHolder(holder: GiphyTaskAdapter.GiphyTaskViewHolder,position: Int) {
        var item:DataItem = list.get(position)
        var imageitem: Images =item.images
        holder.binding.apply {
            img.load(imageitem.original.url){
                crossfade(true)
                crossfade(1000)
            }
        }

        holder.itemView.setonClickListener {mview->

        }
    }

    override fun getItemCount()=list.size

    inner class GiphyTaskViewHolder(val binding: ListItembinding):
        RecyclerView.ViewHolder(binding.root)
}

在我实现 Result.Success 和 Result.Error 逻辑的 viewmodel 类下面

@Hiltviewmodel
class GiphyTaskviewmodel
@Inject
constructor(private val giphyTaskRepository: GiphyTaskRepository):viewmodel()
{
    var giphyresponse = mutablelivedata<Result<List<DataItem>?>>()



    fun getGifsFromText(apikey:String,text:String,limit:Int)= viewmodelScope.launch {
    giphyTaskRepository.getGifsFromText(apikey,limit).let { response->
        if(response?.isSuccessful){
            var list=response.body()?.data
            giphyresponse.postValue(Success(list))
        }else{
            Error(Exception(response.message()))

        }

    }
}

}

在 Repository 类下面

class GiphyTaskRepository
@Inject
constructor(private val giphyTaskApiService: GiphyTaskApiService)
{

    suspend fun getGifsFromText(apikey:String,limit:Int)=
        giphyTaskApiService.getGifsFromText(apikey,limit)
}

在我的网络接口下方

interface GiphyTaskApiService {

    @GET("gifs/search")
    suspend fun getGifsFromText(
        @Query("api_key") api_key:String,@Query("q") q:String,@Query("limit") limit:Int
    ):Response<GiphyResponse>
}

在 GiphyResponse.kt 下方

@Parcelize
data class GiphyResponse(

    @field:Serializedname("pagination")
    val pagination: Pagination,@field:Serializedname("data")
    val data: List<DataItem>,@field:Serializedname("Meta")
    val Meta: Meta
) : Parcelable

在结果类下面

sealed class Result<T>
data class Success<T>(val data: T) : Result<T>()
data class Error(val exception: Exception) : Result<Any?>()

我想知道我必须做什么才能成功实现 result.success 和 result.error 类并传递正确的参数以避免不匹配错误

在实施 murat 的答案后,我遇到了以下不匹配问题

mismatch error

解决方法

更新

您需要检查您的 response 是否成功。类似的东西:

when(response) {
    is Success -> {
        myadapter = GiphyTaskAdapter(this,response.data)
        .......
    }
    is Error -> // Handle error case
}
,

GiphyTaskAdapter 需要 List,但在 ViewModel 中你有 Result

class GiphyTaskAdapter(val context: Context,val list:List<DataItem>)
var giphyresponse = MutableLiveData<Result<List<DataItem>?>>()

例如,您可以在 ViewModel 中更改类型。

var giphyresponse: MutableLiveData<List<DataItem>> = MutableLiveData()
...
val list: List<DataItem> = response.body()?.data ?: emptyList()
giphyresponse.postValue(list)

更新: 密封类可以像马拉写的那样处理。此外,您应该处理空类型。

when(response) {
    is Success -> {
        val list: List<DataItem> = response.data ?: emptyList()
        myadapter = GiphyTaskAdapter(this,list)
        
        .......
    }
    is Error -> // Handle error case
}

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...