Dev*_*arg 26 android kotlin android-jetpack android-viewbinding
如何在适配器中执行最新的喷气背包“视图绑定”,以自动绑定视图。我没有使用 findVeiwById 或 Butterknife 或 Kotlin 合成工具???我已经使用了新的视图绑定,并且对于 Activity 和 Fragment 工作正常。在 build.gradle 文件中启用 viewBinding 后,我能够看到 ActivityHomeBinding 和 FragmentHomeBinding 文件。另外,我看到了用于项目 xml 的 ItemListBinding 类,即 item_list.xml。但是如何在recyclerview的adapter中使用这个文件
viewBinding {
enabled = true
}
Run Code Online (Sandbox Code Playgroud)
主页活动文件
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = ActivityHomeBinding.inflate(layoutInflater)
setContentView(binding.root)
}
Run Code Online (Sandbox Code Playgroud)
分段
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
binding = FragmentHomeBinding.inflate(inflater, container, false)
val view = binding.root
return view
}
Run Code Online (Sandbox Code Playgroud)
Base Adapter:想在这里使用视图绑定。我能够看到 ItemListBinding,但不知道如何使用它。
class BaseAdapter @Inject constructor(
private val context: Context,
private val picasso: Picasso
) :
RecyclerView.Adapter<BaseAdapter.ViewHolder>() {
private var data = ArrayList<Data>()
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
return ViewHolder(
LayoutInflater.from(context).inflate(R.layout.item_list, parent, false)
)
}
override fun getItemCount() = data.size
override fun onBindViewHolder(holder: ViewHolder, position: Int) {
with(holder) {
// TODO
}
}
class ViewHolder(view: View) : RecyclerView.ViewHolder(view) {
@BindView(R.id.tvMovieName)
lateinit var nameTV: TextView
@BindView(R.id.imageView)
lateinit var bannerImage: ImageView
init {
ButterKnife.bind(this@ViewHolder, view)
}
}
fun setData(serverData: ArrayList<Data>) {
data = serverData
notifyDataSetChanged()
}
}
Run Code Online (Sandbox Code Playgroud)
Paw*_*wel 46
您可以使用bindViewBinding 的静态方法从现有布局创建绑定。将其作为属性添加到 viewholder:
class ViewHolder(view: View) : RecyclerView.ViewHolder(view) {
val binding = ItemListBinding.bind(view)
}
Run Code Online (Sandbox Code Playgroud)
然后您可以通过该binding字段访问所有视图,例如:
override fun onBindViewHolder(holder: ViewHolder, position: Int) {
with(holder) {
// TODO
binding.tvMovieName.text = data[position].title
binding.imageView.setDrawableImage(data[position].image)
}
}
Run Code Online (Sandbox Code Playgroud)
Dev*_*arg 23
找到另一个来解决它
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
val binding = ItemListBinding.inflate(LayoutInflater.from(context), parent, false)
return MovieViewHolder(binding)
}
override fun onBindViewHolder(holder: ViewHolder, position: Int) {
with(holder) {
with(moviesData[position]) {
binding.tvMovieName.text = title
}
}
}
}
class MovieViewHolder(val binding: ItemMovieBinding) : RecyclerView.ViewHolder(binding.root)
Run Code Online (Sandbox Code Playgroud)
Epi*_*rce 13
与您通常的做法相比,没有什么真正改变。
class DataAdapter(
private val context: Context,
private val picasso: Picasso
) : RecyclerView.Adapter<DataAdapter.ViewHolder>() {
private var dataList: List<Data> = Collections.emptyList()
override fun getItemCount() = dataList.size
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder = ViewHolder(
LayoutInflater.from(context).inflate(R.layout.item_list, parent, false)
)
override fun onBindViewHolder(holder: ViewHolder, position: Int) {
holder.bind(dataList[position])
}
fun setData(dataList: List<Data>) {
this.dataList = dataList
notifyDataSetChanged()
}
class ViewHolder(view: View) : RecyclerView.ViewHolder(view) {
private val binding = ItemListBinding.bind(view)
fun bind(data: Data) {
with(binding) {
// TODO
nameTV.text = data.name
bannerImage.loadWithPicasso(picasso, data.imageUrl)
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
12654 次 |
| 最近记录: |