LiveData 总是returns LiveData<Object>?

LiveData always returns LiveData<Object>?

我正在尝试放置一个从房间获取数据的回收视图。我的函数 getAllHomework returns LiveData<List<Homework>>,但是当我尝试将 return 值设置为 recyclerview 适配器时,它总是 return 这个错误

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

这是我的 HomeworkViewModel class,它的函数 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
    }
}

下面是我的家庭作业 activity 中试图将值设置到 recyclerview 适配器但总是 return 类型不匹配错误的部分。

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()
    }
}

我找不到在我的代码中我曾经 return List<Homework>? 而不是 List<Homework>.

这实际上与 Room 无关,但与 LiveData 的设计方式有关 - 特别是 Observer class:

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() 
    }
}