【问题标题】:RecyclerView Adapter with ViewDataBinding带有 ViewDataBinding 的 RecyclerView 适配器
【发布时间】:2022-01-18 14:28:26
【问题描述】:

我正在创建一个 GenericAdapter 来处理单行|项目布局。一切正常,只有视图绑定不会更新数据..

我想在回调中获得RecyclerView.ViewHolder 绑定,我知道我可以使用 BR.itemexecutePending

在适配器中绑定它

我想要回调中的 viewDataBinding 上下文

holder.binding.name.text = mutableList[pos]

TestActivity 中的上一行无法正常工作

GenericAdapter.kt

class GenericAdapter<T,VB:ViewDataBinding>(
    var items:MutableList<T>,
    @LayoutRes val resLayoutID:Int,
    val onBind:(holder:GenericViewHolder<T,VB>,pos:Int) -> Unit
): RecyclerView.Adapter<GenericViewHolder<T,VB>>() {

    lateinit var mItemBinding:VB

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): GenericViewHolder<T,VB> {
        val layoutInflater = LayoutInflater.from(parent.context)
        mItemBinding = DataBindingUtil.inflate(layoutInflater, resLayoutID, parent, false)
        return GenericViewHolder(mItemBinding)
    }
    override fun onBindViewHolder(holder: GenericViewHolder<T,VB>, position: Int) {
        onBind(holder,position)
    }
    override fun getItemCount(): Int = items.size
}

GenericViewHolder.kt

class GenericViewHolder<T,VB: ViewDataBinding>(val binding: VB)
    :RecyclerView.ViewHolder(binding.root){

    val mItemBinding:VB = binding
}

TestActivity.kt

class TestActivity:AppCompatActivity() {

    lateinit var recyclerView: RecyclerView
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_test)

        recyclerView = findViewById(R.id.recyclerView)
        recyclerView.layoutManager = LinearLayoutManager(this)
        recyclerView.setHasFixedSize(true)
        populateList()
    }

    private fun populateList(){
        val mutableList = mutableListOf<String>("apple","mango","tutti fruti","apricot",
            "apple","mango","tutti fruti","apricot",
            "apple","mango","tutti fruti","apricot",
            "apple","mango","tutti fruti","apricot")
        val mAdapter = GenericAdapter<String,ItemCountryBinding>(mutableList,R.layout.item_country){ holder,pos ->
        //val nameTv = holder.itemView.findViewById<TextView>(R.id.name)
        //nameTv.text = mutableList[pos]
        holder.binding.name.text = mutableList[pos]
    }
        recyclerView.adapter = mAdapter
    }
}

如下代码工作正常

val nameTv = holder.itemView.findViewById<TextView>(R.id.name)
nameTv.text = mutableList[pos]

【问题讨论】:

    标签: android kotlin android-recyclerview android-viewbinding


    【解决方案1】:

    我建议在view holder 内执行onBind。 我不明白为什么你需要这个回调。 您已经将mutableList 传递给adapter。 例如这里是我的ViewHolder

    class NewsViewHolder(private val binding: ListItemNewsBinding) : RecyclerView.ViewHolder(binding.root) {
    
        fun bind(news: RedditPost, itemClick: (RedditPost, View) -> Unit) {
            with(binding) {
                root.transitionName = news.thumbnail
                root.setOnClickListener { itemClick.invoke(news, binding.root) }
    
                title.text = news.title
                image.setImageUrl(news.thumbnail)
                author.text = news.author
                xHoursAgo.text = news.created_utc
                numComments.text = news.numComments
            }
        }
    }
    

    override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) {
        if (isLoadingMore && position == (itemCount - 1)) return
        (holder as? NewsViewHolder)?.bind(news[position], itemClick)
    }
    

    【讨论】:

      猜你喜欢
      • 2016-01-29
      • 2019-02-04
      • 2017-03-28
      • 2023-03-17
      • 1970-01-01
      • 2016-04-08
      • 1970-01-01
      • 1970-01-01
      • 2018-11-23
      相关资源
      最近更新 更多