如何解决类型不匹配:推断的类型是 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 的答案后,我遇到了以下不匹配问题
解决方法
更新
您需要检查您的 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
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。