当前位置: 首页 > 知识库问答 >
问题:

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

盛柏
2023-03-14

我想创建一个recyclerview,当它在列表中看到LIQUID作为pid时,它将使用具有自己布局的ViewWholder2。否则,它将使用具有自己布局的viewholder1。

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

我还在揣摩RecolyerView的曲折,还没有完全理解。

类MyOrderCart(var MyOrder:MutableList,var MyMutableList:MutableList):RecyclerView.Adapter(){

inner class ViewHolder1(itemView: View) : RecyclerView.ViewHolder(itemView) {

    fun bindView1(mycartlist: MyOrderList){
        itemView.nameView.text = mycartlist.name
        itemView.sizeView.text = "Size: ${mycartlist.size}"

        var iprice = mycartlist.price
        itemView.priceView.text = "Price: $iprice"
        var icount = mycartlist.count
        itemView.countView.text = "Count: $icount"
        var itotal = mycartlist.itemtotal
        itemView.itemtotalView.text = "Subtotal: $itotal"

        var image_checkout = itemView.findViewById(R.id.image_checkout) as ImageView
        var checkout_deletebutton = itemView.findViewById(R.id.checkout_deletebutton) as ImageButton
        var checkout_editcount = itemView.findViewById(R.id.checkout_editcount) as ImageButton
        var mytime = System.currentTimeMillis()

        try {
            Glide.with(image_checkout.getContext()).load(mycarthtml" target="_blank">list.imageUrl)
                .signature(ObjectKey(mytime)).into(image_checkout)
                .clearOnDetach()
        } finally {
            image_checkout.setImageResource(R.drawable.noimage)
        }
    }
}
inner class ViewHolder2(itemView: View) : RecyclerView.ViewHolder(itemView) {
    fun bindView2(mycartlist: MyOrderList){
        itemView.checkout_inside_textview.text = mycartlist.pid
    }
}

override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder {
    var myorderviewtype = myOrder.get(viewType)
        return when (myorderviewtype.pid) {
            "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)
                )
            }
        }
}

override fun onBindViewHolder(viewHolder: RecyclerView.ViewHolder, position: Int) {
    val gsonRaw = GsonBuilder().create()
    var pos = viewHolder.getAdapterPosition()
    var mycartlist: MyOrderList = myOrder.get(position)
    when (viewHolder) {
        is ViewHolder2 -> {
            val liquorviewHolder = viewHolder as ViewHolder2
            liquorviewHolder.bindView2(mycartlist)
        }
        is ViewHolder1 -> {
            val liquorviewHolder = viewHolder as ViewHolder1
            liquorviewHolder.bindView1(mycartlist)
        }
    }

}

共有1个答案

赵驰
2023-03-14

在适配器类中,需要重写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
}

然后,在OnCreateViewWholder方法中,使用类型为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)
            )
        }
    }

}

 类似资料:
  • 上、下、左、右四个方向滑动显示底部视图。 作者说:这个应用在主要是通过一个第三方框架(ViewDeck),实现侧边栏滑动切换视图,顶部和底部滑动切换视图。 [Code4App.com]

  • 本文向大家介绍AngularJS实现使用路由切换视图的方法,包括了AngularJS实现使用路由切换视图的方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了AngularJS实现使用路由切换视图的方法。分享给大家供大家参考,具体如下: 下面是一个简单的学生信息管理实例。 注意:除了引用angular.js之外,还要引用angular-route.js。 1、创建index.html主视图

  • 本文向大家介绍AngularJS入门教程之多视图切换用法示例,包括了AngularJS入门教程之多视图切换用法示例的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了AngularJS多视图切换用法。分享给大家供大家参考,具体如下: 在AngularJS应用中,我们可以將html碎片写在一个单独的文件中,然后在其他页面中將该段碎片加载进来。如果有多个碎片文件,我们还可以在控制器中根据用户的操作

  • 目前,我在为RecycleView定制多视图类型。我找到了很多解决这个问题的方法,但我会分享我的方法。 不同的是使用定义ViewType。 更多细节请参见我的答案。(只想分享)。

  • 以下是活动2的代码:包helloworld.app; 以下是活动1的xml文件代码: 编辑:以下是来自logcat的错误消息 08-01 07:01:11.673:E/AndroidRuntime(1326):at Android.view.view$1.onclick(View.java:3578) 08-01 07:01:11.673:E/AndroidRuntime(1326):at And

  • 我正在尝试在Kotlin和碎片中做视图绑定。 但是当它有很多对象的时候。我需要给它下个定义。所以我不得不看: Kotlin Android视图绑定:findViewById vs Butternife vs Kotlin Android扩展 和 但是我在Android Studio中找不到 我可以在我的程序中做什么?