为什么我不能在内部 class ViewHolder 中使用 var mSelectedItem?

Why can't I use the var mSelectedItem in inner class ViewHolder?

我在 class CustomAdapter 中将 mSelectedItem 定义为 public var,我认为当我在内部 class ViewHolder 中使用 mSelectedItem 时 mSelectedItem=getAdapterPosition() 会正常。

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

还有,Kotlin中getAdapterPosition()有什么好办法,有提示显示"This inspection reports calls to java get and set methods that can be replaced with use of Kotlin synthetic properties",但是用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
        }
    }
}

ViewHolder 是 Recycler 而不是 operator.if 你想要获得位置,你把这个 mSelectedItem = position 放在 onBindViewHolder.And 这个名为 getAdapterPosition() 的方法总是与 notifyItemsetChanged( ).希望这对你有帮助。

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

您本可以通过适配器本身,但它很乱,这就是为什么我建议制作另一个 class。