Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用RecycleView的多视图-Kotlin(Android)-无法切换viewholder_Android_Kotlin_Android Recyclerview_Multiview - Fatal编程技术网

使用RecycleView的多视图-Kotlin(Android)-无法切换viewholder

使用RecycleView的多视图-Kotlin(Android)-无法切换viewholder,android,kotlin,android-recyclerview,multiview,Android,Kotlin,Android Recyclerview,Multiview,我已经浏览了好几天,想找到解决我问题的方法,但我被难住了,无法找出问题的答案。我是Android/Kotlin的相对初学者,所以请容忍我 我有一个如下所示的数据类,我从静态源填充pid值等 类MyOrderList(变量pid:String,变量名称:String,变量imageUrl:String,变量大小:String,变量描述:String,变量价格:Int,变量计数:Int,变量itemtotal:Int) 其基本思想是,如果您遍历上述类列表,pid通常由一个数字或一个特定的词表示,例如

我已经浏览了好几天,想找到解决我问题的方法,但我被难住了,无法找出问题的答案。我是Android/Kotlin的相对初学者,所以请容忍我

我有一个如下所示的数据类,我从静态源填充pid值等

类MyOrderList(变量pid:String,变量名称:String,变量imageUrl:String,变量大小:String,变量描述:String,变量价格:Int,变量计数:Int,变量itemtotal:Int)

其基本思想是,如果您遍历上述类列表,pid通常由一个数字或一个特定的词表示,例如“LIQUID”。所以在我的列表中,位置0将显示pid=“LIQUID”,位置1是一个数字,表示pid=2

我想创建一个recyclerview,当它在列表中将LIQUID视为pid时,它将使用viewholder2和自己的布局。否则,它将在自己的布局中使用viewholder1

问题是,我创建的recyclerview只显示一个viewholder。如果位置0 pid为液体,则viewholder为ViewHolder2,即使对于pid不再为液体的列表中的后续项目也是如此。简而言之,位置0上的pid值将指示整个列表的viewholder

我仍在试图找出RecyclerView的曲折之处,但仍然没有完全理解它

请参阅下面的代码片段

=====================

类MyOrderCart(变量myOrder:MutableList,变量mymutablelist:MutableList): RecyclerView.Adapter(){


嘿,您还没有重写getItemViewType方法。请尝试以下代码

    override fun getItemViewType(position: Int): Int {
    return myOrder.get(position).pid
}

override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder {
    return when (viewType) {
        "LIQUOR" -> {
            ViewHolder2(
                    LayoutInflater.from(parent.context)
                            .inflate(R.layout.insidecheckout_label, parent, false)
            )
        }
        "NOODLES" -> {
            ViewHolder2(
                    LayoutInflater.from(parent.context)
                            .inflate(R.layout.insidecheckout_label, parent, false)
            )
        }
        else -> {
            ViewHolder1(
                    LayoutInflater.from(parent.context)
                            .inflate(R.layout.layout_insidecheckout, parent, false)
            )
        }
    }
}

由于您没有使用getItemViewType发送viewType,因此在onCreateViewHolder中始终会获得0。

在适配器类中,您需要重写
getItemViewType
方法。 像这样:

override fun getItemViewType(position: Int): Int {
    // return view type according to position
    // get your pid using position
    // return 0 for "LIQUOR", 1 for "NOODLES" and 2 for anything else
    // you have to return an integer value only, according to the method signature
}
然后,在
onCreateViewHolder
方法中,使用类型为int的viewType参数对所需视图进行充气:

override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder {

    return when (viewType) {
        0 -> {
            ViewHolder2(
                LayoutInflater.from(parent.context)
                    .inflate(R.layout.insidecheckout_label, parent, false)
            )
        }
        1 -> {
            ViewHolder2(
                LayoutInflater.from(parent.context)
                    .inflate(R.layout.insidecheckout_label, parent, false)
            )
        }
        else -> {
            ViewHolder1(
                LayoutInflater.from(parent.context)
                    .inflate(R.layout.layout_insidecheckout, parent, false)
            )
        }
    }

}

谢谢。getItemViewType需要Int作为返回类型。但你的意见对我帮助很大。谢谢pid不是一个整型变量吗?嗨,Vansh。你的推荐有效!!!我执行了以下操作,并修改了oncreateviewholder以预测viewtype值。重写fun getItemViewType(position:Int):Int{var mycartlist:MyOrderList=myOrder.get(position)when(mycartlist.pid){“酒”->{return 1}“面条”->{return 2}else->{return 0}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder {

    return when (viewType) {
        0 -> {
            ViewHolder2(
                LayoutInflater.from(parent.context)
                    .inflate(R.layout.insidecheckout_label, parent, false)
            )
        }
        1 -> {
            ViewHolder2(
                LayoutInflater.from(parent.context)
                    .inflate(R.layout.insidecheckout_label, parent, false)
            )
        }
        else -> {
            ViewHolder1(
                LayoutInflater.from(parent.context)
                    .inflate(R.layout.layout_insidecheckout, parent, false)
            )
        }
    }