我正在尝试放置一个从房间获取数据的回收器 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/