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

时间:2018-03-21 01:21:18

标签: android kotlin custom-adapter

我将mSelectedItem定义为CustomAdapter类中的public var,我认为mSelectedItem=getAdapterPosition()在内部类ViewHolder中使用mSelectedItem时会出现。

但它失败了,显示"未解决的参考:mSelectedItem"错误,为什么?

而且,对于Kotlin中getAdapterPosition()的好方法,有提示显示"此检查报告调用java get和set方法,可以使用Kotlin合成属性替换#34 ;,但是当我使用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
        }
    }
}

2 个答案:

答案 0 :(得分:2)

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

你本可以通过适配器本身,但它很混乱,这就是为什么我建议再做一个类。

答案 1 :(得分:0)

ViewHolder是Recycler而不是operator.if如果你想获得位置,你将这个mSelectedItem = position放在onBindViewHolder中。这个名为getAdapterPosition()的方法总是与notifyItemsetChanged()一起工作。希望这会有所帮助你。