【问题标题】:Why can't I use the var mSelectedItem in inner class ViewHolder?为什么我不能在内部类 ViewHolder 中使用 var mSelectedItem?
【发布时间】:2018-03-21 01:21:18
【问题描述】:

我在 CustomAdapter 类中将 mSelectedItem 定义为公共 var,我认为当我在内部类 ViewHolder 中使用 mSelectedItem 时,mSelectedItem=getAdapterPosition() 会没问题。

但是失败了,并显示“Unresolved reference: mSelectedItem”错误,为什么?

还有,在 Kotlin 中 getAdapterPosition() 有什么好方法,有提示显示“此检查报告调用 java get 和 set 方法可以替换为使用 Kotlin 合成属性”,但它会导致错误当我使用mSelectedItem=getAdapterPosition 时。

class CustomAdapter (val backupItemList: List<MSetting>) : RecyclerView.Adapter<CustomAdapter.ViewHolder>() {

    public var mSelectedItem = -1


    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): CustomAdapter.ViewHolder {
        val v = LayoutInflater.from(parent.context).inflate(R.layout.item_recyclerview, parent, false)

        return ViewHolder(v)
    }


    override fun onBindViewHolder(holder: CustomAdapter.ViewHolder, position: Int) {
        holder.bindItems(backupItemList[position])
        holder.itemView.radioButton.setChecked(position == mSelectedItem);
    }


    override fun getItemCount(): Int {
        return backupItemList.size
    }


    class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {

        fun bindItems(aMSetting: MSetting) {               

            itemView.radioButton.tag=aMSetting._id
            itemView.textViewUsername.text=aMSetting.createdDate.toString()
            itemView.textViewAddress.text=aMSetting.description
            mSelectedItem=getAdapterPosition()  //It will cause error
        }
    }
}

【问题讨论】:

  • 因为不是inner class ViewHolder
  • 谢谢,我该如何解决?
  • 但是ViewHolder是被CustomAdapter封装的,为什么不是inner class呢?
  • 只是class。这不是inner class。将其指定为inner class,它应该可以工作。

标签: android kotlin custom-adapter


【解决方案1】:

如果您不想将 ViewHolder 设为 inner class(您不应该这样做),您可以创建一个像 AdapterSelection 这样的类,其中包含一个字段 var selectedItem:Int 并将您的 public var mSelectedItem = -1 替换为 private var mSelectedItem = AdapterSelection(-1 )。然后将mSelectedItem 传递给bind 方法(bindItems(aMSetting: MSetting, adapterSelection:AdapterSelection) 并在绑定内部,设置位置adapterSelection.selectedItem = getAdapterPosition()

您本可以通过适配器本身,但它很乱,这就是我建议创建另一个类的原因。

【讨论】:

    【解决方案2】:

    ViewHolder 是 Recycler 而不是操作员。如果你想获得位置,你把这个 mSelectedItem = position 放在 onBindViewHolder 中。并且这个名为 getAdapterPosition() 的方法总是适用于 notifyItemsetChanged()。希望这会对你有所帮助。

    【讨论】:

    • 谢谢!但是位置已经过时了
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-29
    相关资源
    最近更新 更多