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()
}
}
我正在尝试放置一个从房间获取数据的回收视图。我的函数 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()
}
}