admin管理员组

文章数量:1432196

Any idea how to fix this horrible code so that a single touchlistener can handle all the clicks?

        // Devices
        val devices = DeviceDAO(context).getDevicesByType(2)
        adapter = ShipDevicesAdapter(devices)
        binding.shipDevicesRecyclerView.layoutManager = LinearLayoutManager(context)
        binding.shipDevicesRecyclerView.adapter = adapter

        var engine = 0
        binding.engineLayout.engineView1.setOnClickListener {
            binding.shipDevicesRecyclerView.visibility = View.VISIBLE
            engine = 1
        }

        binding.engineLayout.engineView2.setOnClickListener {
            binding.shipDevicesRecyclerView.visibility = View.VISIBLE
            engine = 2
        }

        binding.engineLayout.engineView3.setOnClickListener {
            binding.shipDevicesRecyclerView.visibility = View.VISIBLE
            engine = 3
        }

        binding.engineLayout.engineView4.setOnClickListener {
            binding.shipDevicesRecyclerView.visibility = View.VISIBLE
            engine = 4
        }

        adapter.setOnItemClickListener {
            val resId = Game.getResId(it.image, R.drawable::class.java)
            when(engine){
                1 -> binding.engineLayout.engineView1.setImageResource(resId)
                2 -> binding.engineLayout.engineView2.setImageResource(resId)
                3 -> binding.engineLayout.engineView3.setImageResource(resId)
                4 -> binding.engineLayout.engineView4.setImageResource(resId)
            }
            binding.shipDevicesRecyclerView.visibility = View.GONE
        }

I have tried to collect the view id with view.id, also with view.current focus, also with the R.id.engineView resource, but I don't know how to collect it. The code is in a fragment, not in an activity.

Any idea how to fix this horrible code so that a single touchlistener can handle all the clicks?

        // Devices
        val devices = DeviceDAO(context).getDevicesByType(2)
        adapter = ShipDevicesAdapter(devices)
        binding.shipDevicesRecyclerView.layoutManager = LinearLayoutManager(context)
        binding.shipDevicesRecyclerView.adapter = adapter

        var engine = 0
        binding.engineLayout.engineView1.setOnClickListener {
            binding.shipDevicesRecyclerView.visibility = View.VISIBLE
            engine = 1
        }

        binding.engineLayout.engineView2.setOnClickListener {
            binding.shipDevicesRecyclerView.visibility = View.VISIBLE
            engine = 2
        }

        binding.engineLayout.engineView3.setOnClickListener {
            binding.shipDevicesRecyclerView.visibility = View.VISIBLE
            engine = 3
        }

        binding.engineLayout.engineView4.setOnClickListener {
            binding.shipDevicesRecyclerView.visibility = View.VISIBLE
            engine = 4
        }

        adapter.setOnItemClickListener {
            val resId = Game.getResId(it.image, R.drawable::class.java)
            when(engine){
                1 -> binding.engineLayout.engineView1.setImageResource(resId)
                2 -> binding.engineLayout.engineView2.setImageResource(resId)
                3 -> binding.engineLayout.engineView3.setImageResource(resId)
                4 -> binding.engineLayout.engineView4.setImageResource(resId)
            }
            binding.shipDevicesRecyclerView.visibility = View.GONE
        }

I have tried to collect the view id with view.id, also with view.current focus, also with the R.id.engineView resource, but I don't know how to collect it. The code is in a fragment, not in an activity.

Share Improve this question edited Nov 19, 2024 at 7:12 Delek asked Nov 18, 2024 at 21:23 DelekDelek 234 bronze badges
Add a comment  | 

1 Answer 1

Reset to default 0

I create an array with all the views and then return the selected view, I don't know if it's the most correct but it seems to work

    private lateinit var v: ImageView

   // Code inside onCreateView
    val devices = DeviceDAO(context).getDevicesByTechLearned()
    adapter = DevicesAdapter(devices, context)
    binding.shipDevicesRecyclerView.layoutManager = LinearLayoutManager(context)
    binding.shipDevicesRecyclerView.adapter = adapter

    viewListener()

    adapter.setOnItemClickListener {
        val resId = Game.getResId(it.image, R.drawable::class.java)
        v.setImageResource(resId)
        binding.shipDevicesRecyclerView.visibility = View.GONE
    }

private fun viewListener() {
    val engineView1 = binding.devicesLayout.engineView1
    val engineView2 = binding.devicesLayout.engineView2
    val engineView3 = binding.devicesLayout.engineView3
    val engineView4 = binding.devicesLayout.engineView4

    val engineView = arrayListOf(
        engineView1, engineView2, engineView3, engineView4,
    )

    engineView.forEach { v ->
        v.setOnClickListener {
            viewSelected(v)
        }
    }
}

private fun viewSelected(view: ImageView): ImageView {
    binding.shipDevicesRecyclerView.visibility = View.VISIBLE
    v = view
    return v
}

本文标签: kotlinManage multiples views with a single listenerStack Overflow