android - Android Recyclerview 无法从数据库中获取数据
问题描述
class ResultRecycleViewAdapter(val mDatabase : PromiseDatabase, val request:Int) : RecyclerView.Adapter<ResultRecycleViewAdapter.ResultViewHolder>() {
var yesList: List<Promise> = ArrayList<Promise>()
val executor = Executors.newSingleThreadExecutor()
var noList: List<Promise> = ArrayList<Promise>()
var mHandler = android.os.Handler()
override fun onAttachedToRecyclerView(recyclerView: RecyclerView) {
super.onAttachedToRecyclerView(recyclerView)
setYesList()
setNoList()
Log.d("RecyclerView", "onAttachedToRecyclerView() 실행")
}
fun setYesList() {
Log.d("RecyclerView", "setYesList() 실행")
executor.execute(Runnable {
val tmp = mDatabase.promiseDao().getSuccessPromise()
Log.d("RecyclerView", ""+tmp )
mHandler.post(
Runnable {
yesList= tmp
Log.d("RecyclerView", "mHandler.Post()"+this.yesList+" "+yesList)
}
)
})
}
fun setNoList() {
Log.d("RecyclerView", "setNoList() 실행")
executor.execute(Runnable {
val tmp = mDatabase.promiseDao().getFailPromise()
Log.d("RecyclerView", ""+tmp)
mHandler.post(
Runnable {
Log.d("RecyclerView", "mHandler.Post()")
noList = tmp
}
)
})
}
inner class ResultViewHolder(parent: ViewGroup) : RecyclerView.ViewHolder
(LayoutInflater.from(parent.context).inflate(R.layout.result_recyclerview, parent, false)) {
val content = parent.findViewById(R.id.content_textView_recyclerView) as TextView
val date = parent.findViewById(R.id.date_textView_recyclerView) as TextView
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ResultViewHolder {
Log.d("RecyclerView", "onCreateViewHolder() 실행")
val v =
LayoutInflater.from(parent.context).inflate(R.layout.result_recyclerview, parent, false)
return ResultViewHolder(v as ViewGroup)
}
override fun getItemCount(): Int {
Log.d("RecyclerView", "getItemCount() 실행 noListSize : "+noList.size+" yesListSize : "+yesList.size)
if(request == 0) return noList.size else return yesList.size
}
override fun onBindViewHolder(holder: ResultViewHolder, position: Int) {
Log.d("RecyclerView", "onBindViewHolder() 실행")
Log.d("RecyclerView", yesList.toString() +" "+noList.toString())
if(request == 0){//noList
for(item in noList){
holder.content.text = item.content
holder.date.text = unixTimeToDate(item.date)
}
}
else if(request == 1){
for(item in yesList){
holder.content.text = item.content
holder.date.text = unixTimeToDate(item.date)
}
}
}
fun unixTimeToDate(currentTimeMillis : Int) : String{
Log.d("RecyclerView", "unixTimeToDate() 실행")
val simpleDataFormat : SimpleDateFormat = SimpleDateFormat("yyyy년 MM월 dd일 HH시 mm분 ss초")
return simpleDataFormat.format(currentTimeMillis)
}
}
executor 是为了进入房间。mHandler 用于向 mainThread 发送列表数据。我预计 yesList 和 noList 有项目。但不幸的是,他们没有。getItemCount() 函数只返回 0。
但是执行者和处理者做得很好。并且本地变量 tmp 具有精确值。但是将 tmp 值分配给本地成员变量 yesList 或 noList 不起作用。
我应该怎么办?
解决方案
您忘记在适配器中调用notifyDatasetChanged()。
mHandler.post(
Runnable {
yesList= tmp
notifyDataSetChanged() // Should call this to notify adapter
}
)
每次设置、添加或更新列表时,适配器都不知道这一点,除非您调用适配器 notifyDataSetChanged for ex。通过通知您的适配器,它会调用它的覆盖方法(例如 getItemCount()),从而刷新列表。
推荐阅读
- javascript - Google 跟踪代码管理器、增强型电子商务跟踪和单页应用
- java - 如何使用 java 代码获取显示器宽度/高度?
- r - 相关矩阵的“聚类”
- python - 在类中使用 exec 时出现值错误
- javascript - 如何允许除数字以外的所有字符?
- python - 即使我使用相同的层模块构建完全相同的模型,Tensorflow 和 Keras 的结果也会有所不同
- android - 添加phonegap-plugin-barcodescanner后无法构建cordova android projet
- python - 谷歌云计算引擎 15% 限制
- angular - Typescript 事件类型注解
- swift - 从 Realm 过滤结果