Android Recyclerview从数据库获取数据失败

问题描述 投票:0回答:1
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)
    }


}

执行器用于访问房间,mHandler用于向mainThread发送列表数据。我希望yesList和noList有项目,但不幸的是它们没有。

但是执行器和处理程序做得很好,而且本地变量tmp有精确的值,但是把tmp的值赋给本地成员变量yesList或noList就不行了。

我应该怎么做?

android android-recyclerview handler
1个回答
2
投票

你忘了打电话 notifyDatasetChanged() 在你的适配器中。

mHandler.post(
      Runnable {

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

每次你设置、添加或更新你的列表时,你的适配器还不知道这些,除非你调用适配器notifyDataSetChanged。通过通知你的适配器,它就会调用它的覆盖方法(如getItemCount()),从而刷新列表。

© www.soinside.com 2019 - 2024. All rights reserved.