如何使用kotlin显示在recyclerview中选择的单个项目

时间:2017-12-08 04:56:58

标签: android kotlin

如何使用kotlin在Recyclerview中选择标记单个项目。当我选择一个项目然后点击其他项目之后,应该取消选择之前选择的项目。这是我在kotlin中的适配器类:..

 class ListAdapter(var context: Context, var list: ArrayList<ListModel>) : RecyclerView.Adapter<ListAdapter.MyViewHolder>() {

    override fun onCreateViewHolder(parent: ViewGroup?, viewType: Int): MyViewHolder {
        val v = LayoutInflater.from(parent?.context).inflate(R.layout.list_item, parent, false)
        return MyViewHolder(v)
    }

    override fun getItemCount(): Int {
        return list.size

    }

    override fun onBindViewHolder(holder: MyViewHolder?, position: Int) {
        holder?.bindItems(list[position])
    }

    class MyViewHolder(view: View) : RecyclerView.ViewHolder(view){

        fun bindItems(items: ListModel) {
            itemView.txt_que.text = items.que
            itemView.txt_ans.text = items.ans
            itemView.txt_sr_no.text = items.srNo
        }
}`

3 个答案:

答案 0 :(得分:2)

这里dataItem是模型类,请在模型类中使用一个额外的布尔变量isSelected(默认值为false),在选择项目时为true,然后在选定位置为true, 下面是示例:

class AllModuleListAdapter(
var context: Context?,
private var moduleList: ArrayList<DataItem?>?,
private var mCallback: DeviceClickListener
) :
RecyclerView.Adapter<AllModuleListAdapter.MyViewHolder>() {

override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): MyViewHolder {
    val context = parent.context
    val itemView = LayoutInflater.from(context).inflate(R.layout.item_modules, parent, false)
    return MyViewHolder(itemView)
}

override fun getItemCount(): Int {
    return moduleList?.size ?: 0
}

override fun onBindViewHolder(holder: MyViewHolder, position: Int) {
    holder.bind(moduleList?.get(position))

    if (moduleList?.get(position) is DataItem) {
        val dataItem = moduleList?.get(position) as DataItem
        if (dataItem.isSelected) {
            context?.let { ContextCompat.getColor(it, R.color.colorOrange) }
                ?.let { holder.itemView.setBackgroundColor(it) }

        } else {
            context?.let { ContextCompat.getColor(it, R.color.white) }
                ?.let { holder.itemView.setBackgroundColor(it) }

        }
    }

}

inner class MyViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
    init {
        itemView.constraint_main.setOnClickListener {
            val list = moduleList as List<DataItem>
            for (item in list.indices) {
                list[item].isSelected = false
            }
            list[adapterPosition].isSelected = true

            mCallback.onDeviceClick(adapterPosition)
            notifyDataSetChanged()

            context?.let { it1 -> ContextCompat.getColor(it1, R.color.colorOrange) }?.let { it2 ->
                itemView.constraint_main?.setBackgroundColor(it2)
            }

        }

    }

    fun bind(module: DataItem?) {
        itemView.txtModuleName?.text = module?.id.toString()
        itemView.txtSignal?.text = module?.room
    }

 }
}

答案 1 :(得分:1)

        if (mPosition == position)
        {
            //set selected here
        } else
        {
            //set unselected here
        }

        holder.parentView.setOnClickListener(new View.OnClickListener()
        {
            @Override
            public void onClick(View view)
            {
                mPosition = position;
                notifyDataSetChanged();
            }
        });

在onBindViewholder上编写上面的代码,并在适配器类

中将mPosition声明为全局int变量

答案 2 :(得分:0)

尝试使用: - 将ListModel类中的一个变量作为

var selected:boolean  = false

然后在设置listModel项时将此值设置为false为

for(int i=0;i<listModel.size;i++){
   listModel.get(i).selected = false
}//this is for setting all values false

从列表中选择任何项目时,调用此方法,然后为所选位置设置selected = true,只需刷新适配器列表。

在适配器中

检查此选定值,并相应地在bindItems方法中设置复选框值

  itemView.checkBox.selected = items.selected//this will set your checkbox selected value