如何获得选择的弹出菜单项目位置值并传递它

问题描述 投票:-1回答:1

我有一个Popup menu,只要单击弹出菜单项,它应该启动Maps意图。在popupMenu.setOnMenuItemClickListener中,是否有人知道我如何才能通过单击的String项目的Popup menu(来自arrayAMap数组)并将其用于意图?我已经有了Arrays,但似乎无法找出实现此功能的正确方法。

class MyAdapter(
    private val mCtx: Context,
    var myList: MutableList<ItemRV>
) : RecyclerView.Adapter<RecyclerView.ViewHolder>(), PopupMenu.OnMenuItemClickListener {
    private var mClickListener: ItemClickListener? = null

    lateinit var mAdView : AdView

    private val itemRV = 1
    private val itemAD = 2

    override fun getItemViewType(position: Int): Int {
        return if (position % 4 == 0) {
            itemAD
        } else {
            itemRV
        }
    }

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder {
        return if (viewType == itemAD) {
            val v = LayoutInflater.from(mCtx).inflate(R.layout.item_ad, parent, false)
            AdViewHolder(v)
        } else {
            val v = LayoutInflater.from(mCtx).inflate(R.layout.item_rv, parent, false)
            AreaViewHolder(v)
        }
    }

    override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) {
        when(holder) {
            is AdViewHolder -> {
                MobileAds.initialize(mCtx) {}
                mAdView = holder.itemView.findViewById(R.id.adView)
                val adRequest = AdRequest.Builder().build()
                mAdView.loadAd(adRequest)
            }

            is AreaViewHolder -> {
            val positionToBind = position - position / 4 - 1
            val product = myList[positionToBind]
            holder.tvTitle.text = product.itemTitle
            }
        }
    }

    override fun getItemCount(): Int {
        return myList.size
    }


    inner class AdViewHolder(itemView: View) : androidx.recyclerview.widget.RecyclerView
    .ViewHolder(itemView), View.OnClickListener {
        override fun onClick(v: View?) {
        }
    }

    inner class AreaViewHolder(itemView: View) : androidx.recyclerview.widget.RecyclerView
    .ViewHolder(itemView), View.OnClickListener {
        var tvTitle: TextView = itemView.tvtitle

        // Use package name which we want to check
        private val isAppInstalled = appInstalledOrNot("com.google.android.apps.maps")
        private val isLiteAppInstalled = appInstalledOrNot("com.google.android.apps.mapslite")

            fun launchMapIntent(nameLocation: String) {
                val mapPkg = when {
                    isAppInstalled -> "com.google.android.apps.maps"
                    isLiteAppInstalled -> "com.google.android.apps.mapslite"
                    else -> null
                }
                val mapIntent = if(mapPkg != null) {
                    val gmmIntentUri = Uri.parse("geo:0,0?q=$nameLocation")
                    Intent(Intent.ACTION_VIEW, gmmIntentUri).setPackage(mapPkg)
                } else {
                    val encLoc = Uri.encode(nameLocation)
                    val str = "https://www.google.com/maps/place/$encLoc/"
                    Intent(Intent.ACTION_VIEW, Uri.parse(str))
                }
                mCtx.startActivity(mapIntent)
            }

            val arrayA = arrayOf(view.resources.getString(R.string.stockholm),
                view.resources.getString(R.string.copenhagen))
            val arrayAMap = arrayOf("Stockholm, Sweden", "Copenhagen, Denmark")

            fun launchPopupMenu(namePopupItemLocation: Array<String>, nameLocation: Array<String>){
                val popupMenu = PopupMenu(ibMap.context, ibMap)

                for (item in namePopupItemLocation) {
                    popupMenu.menu.add(item)
                }

                popupMenu.setOnMenuItemClickListener {
                  launchMapIntent(nameLocation.get())
                    true
                }

                popupMenu.show()
            }

            ibMap.setOnClickListener {
                when(tvTitle.text.toString()) {
                    "A" -> launchMapIntent("Paris, France")
                    "B" -> launchPopupMenu(arrayA, arrayAMap)

                    else -> return@setOnClickListener
                }
            }
        }


        private fun appInstalledOrNot(uri: String): Boolean {
            val pm = mCtx.packageManager
            try {
                pm.getPackageInfo(uri, PackageManager.GET_ACTIVITIES)
                return true
            } catch (e: PackageManager.NameNotFoundException) {
            }
            return false
        }

    }

    // Parent activity will implement this method to respond to click events
    interface ItemClickListener {
        fun onItemClick(view: View, position: Int)
    }

    override fun onMenuItemClick(item: MenuItem?): Boolean {
    }
}
android kotlin android-recyclerview android-arrayadapter android-popupwindow
1个回答
0
投票

您可以在setOnMenuItemClickListener中获得单击的菜单项,并从该菜单项中获得该菜单的标题

 popupMenu.setOnMenuItemClickListener { item ->
            nameLocation.forEach {
                if (it.toLowerCase().startsWith(item.title.toLowerCase())) {
                    launchMapIntent(it)
                }
            }
            true
        }

希望这会有所帮助!

© www.soinside.com 2019 - 2024. All rights reserved.