首页 > 解决方案 > 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 不起作用。

我应该怎么办?

标签: androidandroid-recyclerviewhandler

解决方案


您忘记在适配器中调用notifyDatasetChanged()

mHandler.post(
      Runnable {

         yesList=  tmp
          notifyDataSetChanged() // Should call this to notify adapter
       }
 )

每次设置、添加或更新列表时,适配器都不知道这一点,除非您调用适配器 notifyDataSetChanged for ex。通过通知您的适配器,它会调用它的覆盖方法(例如 getItemCount()),从而刷新列表。


推荐阅读