ViewHolder:如何在 Groupie RecyclerView 库的 bind() 函数中获取上下文?

ViewHolder: How to get context inside bind() function of Groupie RecyclerView Library?

我正在使用流行的 Groupie 库生成 Recycler 视图来显示我的 Firebase 数据库中的用户列表。在 ViewHolder class 的 bind() [onBindViewHolder() 不使用 Groupie] 中,我试图从根据用户的配置文件图像创建的调色板中获取主导颜色,并将该颜色设置为 Imageview 的阴影颜色。

但是,要使用调色板,我需要在

中提供上下文

palette.getDominantColor(ContextCompat.getColor(context, R.color.defaultColor))

问题是,如何在 bind() 函数中获取此上下文。如果我尝试在函数中传递上下文,它会丢失 Override & 我得到错误 'bind' overrides nothing.

这是我的代码,可以更好地理解问题。

class FirebaseSearchActivity: AppCompatActivity() {

  //Get Firebase Database Reference
  private val dbRef = FirebaseDatabase.getInstance().getReference("/users")

  override fun onCreate(savedInstanceState: Bundle ? ) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_firebase_search)

    val searchToolbar: Toolbar = findViewById(R.id.search_toolbar)
    setSupportActionBar(searchToolbar)
    supportActionBar ? .setDisplayShowTitleEnabled(false)

    getUserResults()
  }

  private fun getUserResults() {
    dbRef.addListenerForSingleValueEvent(object: ValueEventListener {
      override fun onDataChange(p0: DataSnapshot) {

        //Setup Groupie Adapter
        val adapter = GroupAdapter < ViewHolder > ()

        //Fetch Snapshot of Database
        p0.children.forEach {
          Log.d("FetchedUsers", "$it")
          //Assign Fetched Data to Model Class
          val user = it.getValue(User::class.java)
          //Null Check
          if (user != null) {
            adapter.add(ResultItem(user, baseContext))
          }
        }

        //Attach Groupie Adapter to the Recycler View
        firebase_result_list.adapter = adapter
      }

      override fun onCancelled(p0: DatabaseError) {
        //Show Error
        Log.d("FetchedUsers", "$p0")
        Toast.makeText(baseContext, "$p0", Toast.LENGTH_LONG).show()
      }
    })
  }
}
//ViewHolder
class ResultItem(val user: User, ctx: Context): Item < ViewHolder > () {

  //Setup List Row Layout to View Holder
  override fun getLayout(): Int {
    return R.layout.search_list_layout
  }

  //Change values of text fields or image views inside the list's layout
  override fun bind(viewHolder: ViewHolder, position: Int) {

    //Load Username
    Log.d("FetchedUserName", "Username: ${user.username}")
    viewHolder.itemView.search_list_username.text = user.username
    //Load Profile Pic
    Glide.with(viewHolder.itemView)
      .asBitmap()
      .load(user.profileImage)
      .diskCacheStrategy(DiskCacheStrategy.ALL)
      .listener(object: RequestListener < Bitmap > {
        override fun onLoadFailed(
          e: GlideException ? ,
          model : Any ? ,
          target : com.bumptech.glide.request.target.Target < Bitmap > ? ,
          isFirstResource : Boolean
        ): Boolean {
          return false
        }

        override fun onResourceReady(
          resource: Bitmap ? ,
          model : Any ? ,
          target : com.bumptech.glide.request.target.Target < Bitmap > ? ,
          dataSource : DataSource ? ,
          isFirstResource : Boolean
        ): Boolean {
          if (resource != null) {
            val p = Palette.from(resource).generate()
            // Use generated instance
            viewHolder.itemView.search_list_profile.shadowColor = p.getDominantColor(ContextCompat.getColor(ctx, R.color.defaultColor))
          }
          return false

        }
      })
      .into(viewHolder.itemView.search_list_profile)

  }
}

声明你的

ctx:Context

这样

private val ctx:Context

这种方式将能够访问整个内容 class。

viewHolder.itemView.context

这对我有用。我用它在我的父适配器内为嵌套的回收器视图创建了一个子适配器。