突出显示recyclerview的选定项目

问题描述

请不要将其标记为重复,我指的是this answer

发生异常:

kotlin.KotlinNullPointerException at package.name.ProductDetails.Custom_detail_Adapter.onBindViewHolder(Custom_detail_Adapter.kt:57)

这是一行:

holder.relativeitem.setSelected(selectedItems?.get(position,false)!!);

我还想知道如何在加载活动时首先setSelected在位置上。 (如何预填充SparseBooleanArray?)

这是我的适配器:

    class  Custom_detail_Adapter(context: Context,dataList: List<Product_images_response>) :
    RecyclerView.Adapter<Custom_detail_Adapter.CustomViewHolder>() {
    private val dataList: List<Product_images_response>
    private val context: Context
    private val selectedItems: SparseBooleanArray?=null

    inner class CustomViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView),View.OnClickListener {
        val mView: View

         val avatar: ImageView
         val relativeitem:RelativeLayout

        init {
            mView = itemView

            avatar = mView.findViewById(R.id.view3)
            relativeitem=mView.findViewById(R.id.relativeitem)
        }

        override fun onClick(v: View?) {
            if (selectedItems?.get(getAdapterPosition(),false)!!) {
                selectedItems?.delete(getAdapterPosition());
                relativeitem.setSelected(false);
            }
            else {
                selectedItems?.put(getAdapterPosition(),true);
                relativeitem.setSelected(true);
            }
        }

    }

    override fun onCreateViewHolder(parent: ViewGroup,viewType: Int): CustomViewHolder {
        val layoutInflater = LayoutInflater.from(parent.context)
        val view: View = layoutInflater.inflate(R.layout.product_detail_item,parent,false)
        return CustomViewHolder(view)
    }

    override fun onBindViewHolder(holder: CustomViewHolder,position: Int) {
        holder.relativeitem.setSelected(selectedItems?.get(position,false)!!);

     Glide.with(context).load(dataList[position].image)
            .thumbnail(0.5f)
            .diskCacheStrategy(diskCacheStrategy.ALL)
            .into(holder.avatar)


        holder.avatar.setonClickListener(View.OnClickListener {
           
            val intent = Intent("custom-message")
        
            intent.putExtra("item",dataList.get(position).image)
            LocalbroadcastManager.getInstance(context).sendbroadcast(intent)
        })
    }

    override fun getItemCount(): Int {
        return dataList.size
        //return (dataList == null) ? 0 : dataList.size();
    }

    init {
        this.context = context
        this.dataList = dataList
    }
    }

这是我的布局:

    <?xml version="1.0" encoding="utf-8"?>
    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="wrap_content"
    android:id="@+id/relativeitem"
    android:background="@drawable/activated_color_selector"
    android:layout_height="wrap_content">
    <ImageView
        android:layout_width="235px"
        android:layout_height="207px"
        android:id="@+id/view3"

        android:layout_marginLeft="10dp"
        android:layout_marginRight="10dp"
        android:layout_weight="1"
        />
        </RelativeLayout>

需要帮助!谢谢。

解决方法

首先,给selectedItems变量赋一个初始值。也无需将其设置为可选,从而消除了用问号解开可选值的需要(此selectedItems?变为此selectedItems):

private val selectedItems = SparseBooleanArray()

如果要在加载适配器之前设置选定位置,请将该变量用作构造函数参数之一。使用此主要构造函数,您可以删除init块:

class  Custom_detail_Adapter(private val context: Context,private val dataList: List<Product_images_response>,private val selectedItems: SparseBooleanArray) :
RecyclerView.Adapter<Custom_detail_Adapter.CustomViewHolder>() {

inner class CustomViewHolder ...

SparseBooleanArray构造函数参数可以预先填充表示所选项目的值。