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

Andoid开发人员基础培训

饶德本
2023-03-14

我正在做基本的android开发人员教程,我正在开发dogglers应用程序:https://developer.android.com/codelabs/basic-android-kotlin-training-project-dogglers-app?continue=https://developer.android.com/courses/pathways/android-基础知识-kotlin-unit-2-pathway-3#codelab-https://developer.android.com/codelabs/basic-android-kotlin-training-project-dogglers-app#3

所有的测试都很顺利,但我发现了一个问题。在网格选项I中,项目卡片具有垂直/水平布局,而不是od网格布局。我做错了什么?我发现viewType总是0,而不是od 1、2或3,它们分别是水平、垂直和栅格的值。

我的适配器:

class DogCardAdapter(
    private val context: Context?,
    private var layout: Int,
    private val dataset: List<Dog> = dogs
): RecyclerView.Adapter<DogCardAdapter.DogCardViewHolder>() {


    // Done: Initialize the data using the List found in data/DataSource (POWYŻEJ ZAINICJALIZOWALEM)

    /**
     * Initialize view elements
     */
    class DogCardViewHolder(view: View?, ViewType: Int): RecyclerView.ViewHolder(view!!) {
        // DONE: Declare and initialize all of the list item UI components
        val tvDogPhoto: ImageView = view!!.findViewById(com.example.dogglers.R.id.dog_photo)
        val tvDogName: TextView = view!!.findViewById(com.example.dogglers.R.id.dog_name)
        val tvDogAge: TextView = view!!.findViewById(com.example.dogglers.R.id.dog_age)
        val tvDogHobbies: TextView = view!!.findViewById(com.example.dogglers.R.id.dog_hobbies)

    }

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): DogCardViewHolder {
        // DONE: Use a conditional to determine the layout type and set it accordingly.
        //  if the layout variable is Layout.GRID the grid list item should be used. Otherwise the
        //  the vertical/horizontal list item should be used.
        // DONE Inflate the layout
        /** val layoutType = if (viewType==Layout.GRID) {
            R.layout.grid_list_item
        }else{
            R.layout.vertical_horizontal_list_item
        }
        val adapterLayout = LayoutInflater.from(parent.context).inflate(layoutType,parent,false)
        */
        //layout = 3
        val text = viewType.toString()
        val duration = Toast.LENGTH_SHORT

        val toast = Toast.makeText(parent.context, text, duration)
        toast.show()


         val adapterLayout = if (viewType==3) {
            LayoutInflater.from(parent.context).inflate(com.example.dogglers.R.layout.grid_list_item,parent,false)
        }else{
            LayoutInflater.from(parent.context).inflate(com.example.dogglers.R.layout.vertical_horizontal_list_item,parent,false)
        }
        // DONE: Null should not be passed into the view holder. This should be updated to reflect
        //  the inflated layout.
        return DogCardViewHolder(adapterLayout,layout)
    }

    override fun getItemCount(): Int = dataset.size // DONE: return the size of the data set instead of 0

    override fun onBindViewHolder(holder: DogCardAdapter.DogCardViewHolder, position: Int) {
        // DONE: Get the data at the current position
        val dog = dataset[position]
        // DONE: Set the image resource for the current dog
        holder.tvDogPhoto.setImageResource(dog.imageResourceId)
        // DONE: Set the text for the current dog's name
        holder.tvDogName.text = dog.name
        // DONE: Set the text for the current dog's age
        val resources = context?.resources
        holder.tvDogAge.text = resources?.getString(com.example.dogglers.R.string.dog_age, dog.age)
        // Done: Set the text for the current dog's hobbies by passing the hobbies to the
        //  R.string.dog_hobbies string constant.
        //  Passing an argument to the string resource looks like:
        //  resources?.getString(R.string.dog_hobbies, dog.hobbies)
        holder.tvDogHobbies.text = resources?.getString(com.example.dogglers.R.string.dog_hobbies, dog.hobbies)
    }

}

有人能帮我吗?

共有2个答案

子车鸿运
2023-03-14

我不知道为什么DogCardViewHolder有两个参数。在截至2022年6月20日的原始源代码中,代码为ff:

class DogCardViewHolder(view: View?): RecyclerView.ViewHolder(view!!) {
     ...
}

因此,在您的onCreateViewHolder类中,返回的DogCardViewHolder()应该包含基于@Tenfri04提到的布局var的适当布局。

我将编写如下代码:


override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): DogCardViewHolder {
    val layoutType = when(layout) {
        Layout.GRID -> {
            R.layout.grid_list_item
        }
        else -> {
            R.layout.vertical_horizontal_list_item
        }
    }

    val adaptTo = LayoutInflater.from(parent.context).inflate(layoutType, parent, false)
    return DogCardViewHolder(adaptTo)
}

轻触(与功能无关):注意,我在java/com/example/dogglers/const/Layout中使用了写入源代码的常量。千吨级

直接将3编码到if/time条件中可能会令人困惑。

仲孙毅
2023-03-14

适配器构造函数中定义的布局属性是用来确定要充气的布局的属性。您使用了viewType,当同一适配器中存在不同类型的视图时,适配器使用该值,例如如果一个列表项类型是子节标题。

所以,替换

val adapterLayout = if (viewType==3) //...

具有

val adapterLayout = if (layout == 3) //...

不幸的是,这个代码实验室中的源代码也助长了一些不良做法。我不知道他们是否把它们放进去,看看你是否能发现并修复它们,或者这只是一个草率的设计。

>

  • 此适配器连接到具有上下文的RecyclerView。它有一个可为null的上下文属性是没有意义的,因为它在没有上下文的情况下永远不存在,没有上下文就没有用处,所以没有理由让它为null,然后让所有那些nullsafe属性都为null 在BindViewHolder中调用。

    DogCardViewHolder的构造函数接受一个可为null的view参数,并在超级构造函数调用中立即断言该参数为非null。这是荒谬的。它无缘无故地将应该是编译错误的内容推到运行时崩溃,并导致一堆毫无意义的<代码> 函数内部的调用。

  •  类似资料:
    • 我正在尝试使用Hybris,但无法访问Wiki。我的朋友向我提供了该应用程序的试用版,最近我在阅读论坛时遇到了下面两个文档的名称,这可以帮助我学习。 谁能告诉我怎么才能得到这两个? SAP HY400:SAP Hybris商务开发人员培训–第1部分–Hybris v6。2. SAP HY410:SAP Hybris商务开发人员培训–第2部分–Hybris v6。2. 非常感谢!

    • 随着微服务架构、云计算、单页应用和响应式设计的兴起,Web前端技术发展迅速。当前在网站开发中使用现代前端技术已经是基本形态,你可以基于Canvas、WebGL来开发二三维的H5游戏,也可以使用React Native等框架来开发新一代的移动APP,还可以使用Nodejs等框架来开发桌面应用,还可以开发ChromeAPP(PWA)、微信小程序、以及这几年很流行的WebVR和AR。 对于GIS行业来说

    • 开发人员协议 请务必认真阅读和理解本《360浏览器应用开放平台开发人员协议》(以下简称"协议")中规定的所有权利和限制。在您参与360浏览器应用开放平台并使用应用中心分发产品时,您首先应接受本《协议》条款,如果您不接受本协议或违反了协议,奇虎360有权采取以下措施:驳回应用审核、下线产品、删除帐户、拒绝访问等。 本《协议》是开发人员与北京奇虎科技有限公司(下称"奇虎360")之间关于利用360浏览

    • Project V Project V 由以下几部分组成: V2Ray 核心: v2ray.com/core V2Ray 手册: v2ray.com 周边项目: 详见客户端 V2Ray 项目组 V2Ray 项目组最初是为了 V2Ray 核心的开发而建立,现在已推广到整个 Project V 生态环境。我们欢迎你加入组织参与开发。当然你也选择可以使用自己的 V2Ray 之外的环境。 加入 V2Ray

    • 本文向大家介绍测试人员和开发人员区别?相关面试题,主要包含被问及测试人员和开发人员区别?时的应答技巧和注意事项,需要的朋友参考一下 ①人员不同 测试:开发人员和测试人员 开发:只有开发人员 ②所处阶段不同 测试:贯穿整个软件开发生命周期 调试:在软件开发编码阶段以及测试过程中对BUG进行调试 ③对bug处理结果不同 测试:只找出错误,不解决 调试:找出错误并解决

    • Subversion 中的分支、标记和合并 虽然很多开发团队都使用版本控制系统管理代码变更,但当多个开发人员并行地使用不同的代码库进行编码时,还是会出现问题的。在本期的 让开发自动化 中,自动化专家 Paul Duvall 展示了如何运用开源的、免费的 Subversion 版本控制系统来有效地进行标记、分支和合并。 说到源代码分支,可以将大多数的软件开发团队大致划分为两大阵营:有些是根本不分支;