kotlin - LiveData 总是返回 LiveData<Object>?

标签 kotlin android-room

我正在尝试放置一个从房间获取数据的回收器 View 。我的功能getAllHomework返回LiveData<List<Homework>> ,但是当我尝试设置recyclerview适配器的返回值时,它总是会返回这个错误

Type Mismatch.
Required: List<Homework>
Found: List<Homework>?

这是我的 HomeworkViewModel 类,其功能为 getAllHomework看起来像:

class HomeworkViewModel : ViewModel() {

    private var matrixNumber: String? = null
    private var schoolID: Int = 0

    lateinit var listAllHomework: LiveData<List<Homework>>
    lateinit var homeworkRepository: HomeworkRepository

    fun init(params: Map<String, String>) {

        schoolID = Integer.parseInt(params["schoolID"])

        homeworkRepository = HomeworkRepository()
        listAllHomework = homeworkRepository.getAllHomework(1, "2018")

    }

    fun getAllHomework(): LiveData<List<Homework>>{
        return listAllHomework
    }
}

下面是我的作业事件中尝试将值设置到 recyclerview 适配器中的部分,但始终会返回类型不匹配错误。

class Homework : AppCompatActivity(), LifecycleOwner {

    lateinit var linearLayoutManager: LinearLayoutManager

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.homework)

        linearLayoutManager = LinearLayoutManager(this)
        rvHomeworks.layoutManager = linearLayoutManager

        var adapter = AdapterHomework(this)

        rvHomeworks.adapter = adapter

        var homeworkViewModel = ViewModelProviders.of(this).get(HomeworkViewModel::class.java)
        homeworkViewModel.init(params)
        homeworkViewModel.getAllHomework().observe(this, Observer {
            allHomework -> adapter.setHomeworkList(allHomework)
        })
    }
}

线路allHomework -> adapter.setHomeworkList(allHomework)上面将显示Type Mismatch我上面提到的错误。

这是我的 AdapterHomework看起来像:

class AdapterHomework(context: Context): RecyclerView.Adapter<AdapterHomework.ViewHolder>() {

lateinit var homeworkList: List<Homework>
    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder{
        val v = LayoutInflater.from(parent.context).inflate(R.layout.rv_homeworks, parent, false)
        return ViewHolder(v);
    }

    @JvmName("functionToSetTheHomeworkList")
    fun setHomeworkList(myHomeworkList: List<Homework>){
        homeworkList = myHomeworkList
        notifyDataSetChanged()
    }
}

我找不到我在代码中返回过的位置 List<Homework>?而不是List<Homework> .

最佳答案

这实际上与 Room 无关,但是如何LiveData专门设计Observer类:

public interface Observer<T> {

    void onChanged(@Nullable T t);
}

如您所见, T (在您的情况下为 List<Homework> )被标记为 @Nullable因此你总是会得到它的 Kotlin 等效项 List<Homework>?作为 onChanged 的参数在你的Observer实现。

我建议更改 setHomeworkList像这样的事情:

fun setHomeworkList(myHomeworkList: List<Homework>?){
    if(myHomeworkList != null){
        homeworkList = myHomeworkList
        notifyDataSetChanged()
    }
}

您还可以使用let像这样的函数:

fun setHomeworkList(myHomeworkList: List<Homework>?){
    myHomeworkList?.let {
        homeworkList = it
        notifyDataSetChanged() 
    }
}

关于kotlin - LiveData 总是返回 LiveData<Object>?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51598985/

相关文章:

android-studio - android studio 中的 Kotlin 单元测试

android - 如何在 Google Direction API 绘制的特定折线上将当前交通数据绘制到谷歌地图

java - Springboot : How to execute custom mongodb query by springboot?

kotlin - Unresolved reference : RoomDatabase

android - 通过 AsyncTask 在 onCreate() 期间加载数据

android - Kotlin Android 惰性类初始化在杀死 App 后仍然存在

android - 是否会为新用户运行房间迁移?

android - 没有 onCreateView 的 Fragment

android - BottomNavigationView.setupWithNavController 不工作

java - 如何使用带有FK的表在查询室中获取完整的实体对象