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
这对我有用。我用它在我的父适配器内为嵌套的回收器视图创建了一个子适配器。
我正在使用流行的 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
这对我有用。我用它在我的父适配器内为嵌套的回收器视图创建了一个子适配器。