如何在 Activity 内的 RecyclerView 适配器声明中声明单击侦听器

     2023-04-19     38

关键词:

【中文标题】如何在 Activity 内的 RecyclerView 适配器声明中声明单击侦听器【英文标题】:How to declare click listener within RecyclerView adapter declaration inside Activity 【发布时间】:2021-02-02 18:20:58 【问题描述】:

我正在尝试将我的 Activity(包含 RecyclerView)与 RecyclerView 适配器连接,但在声明部分卡住了。我知道需要指定与我的适配器类中的单击侦听器参数关联的值,但我不确定当每个 RecyclerView 项具有不同的值时应该是什么值。

mAdapter = MyAdapter(this, mList, true, ?)

关于应该用什么替换问号有什么想法吗?

活动

class MainActivity : AppCompatActivity() 
    private lateinit var mAdapter: MyAdapter
    private val mList = ArrayList<MyItem>()

    override fun onCreate(savedInstanceState: Bundle?) 
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        mList.add(
                ItemCompany(
                        getString(R.string.bing)
                )
        )
        mList.add(
                ItemCompany(
                        getString(R.string.google)
                )
        )
        mList.add(
                ItemCompany(
                        getString(R.string.yahoo)
                )
        )

        val mRecyclerView = findViewById<RecyclerView>(R.id.myRecyclerView)
        mRecyclerView.layoutManager =
                        androidx.recyclerview.widget.LinearLayoutManager(this)
        mAdapter = MyAdapter(this, mList, true, ?)
        mRecyclerView.addItemDecoration(
                        androidx.recyclerview.widget.DividerItemDecoration(
                                this,
                                LinearLayout.VERTICAL
                        )
                )
        mRecyclerView.adapter = mAdapter
    

RecyclerView 适配器

class MyAdapter(
        val myContext: Context,
        var listCompany: MutableList<ItemCompany>,
        private val mTwoPane: Boolean,
        private val itemClickListener: AdapterView.OnItemClickListener
) : androidx.recyclerview.widget.RecyclerView.Adapter<MyAdapter
.CompanyViewHolder>() 

    class CompanyViewHolder(itemView: View) : androidx.recyclerview.widget.RecyclerView
    .ViewHolder(itemView) 
        var tvTitle: TextView = itemView.findViewById(R.id.tv_RVItem)

        fun bind(company: ItemCompany, clickListener: AdapterView.OnItemClickListener)
        
            tvTitle.text = company.companyName

            itemView.setOnClickListener v ->
                val intent: Intent = when (company.companyName) 
                    v.resources.getString(R.string.bing) -> 
                        Intent(Intent.ACTION_VIEW,
                                Uri.parse("https://www.bing.com/"))
                    
                    v.resources.getString(R.string.google) -> 
                        Intent(Intent.ACTION_VIEW,
                                Uri.parse("https://www.google.com/"))
                    
                    else -> 
                        Intent(Intent.ACTION_VIEW,
                                Uri.parse("https://www.yahoo.com/"))
                    
                
                itemView.getContext.startActivity(intent)
            
        
    

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): CompanyViewHolder 
        val inflater = LayoutInflater.from(myContext)
        val v = inflater.inflate(R.layout.rv_item, parent, false)
        return CompanyViewHolder(v)
    

    override fun onBindViewHolder(holder: CompanyViewHolder, position: Int) 
        val product = listCompany[holder.adapterPosition]

        holder.tvTitle.text = product.companyName

        holder.bind(product, itemClickListener)
    

    override fun getItemCount(): Int 
        return listCompany.size
    

    override fun getFilter(): Filter 
        return companyFilter
    

【问题讨论】:

【参考方案1】:

您可以使用 lamda 声明您的点击侦听器:

val mListener = AdapterView.OnItemClickListener  parent, view, position, id -> 
val mAdapter = MyAdapter(this, mList, true, mListener)

或者简单地说:

val mAdapter = MyAdapter(this, mList, true)  parent, view, position, id -> 

【讨论】:

recyclerview 内的 RecyclerView 只显示父 recyclerview 的最后一项

】recyclerview内的RecyclerView只显示父recyclerview的最后一项【英文标题】:RecyclerViewinsiderecyclerviewshowsonlylastitemsofparentrecyclerview【发布时间】:2021-01-0900:38:34【问题描述】:我在父recyclerview中有一个子recyclerview。只有父recyclerview的最... 查看详情

在 Fragment 中集成 Map 而不是 Activity

】在Fragment中集成Map而不是Activity【英文标题】:IntegrateMapinFragmentinsteadofActivity【发布时间】:2021-01-1019:00:35【问题描述】:我想在MainActivity内的片段中添加Google地图。但我在以下语句中遇到错误。这个fusedLocationProviderClient=Locatio... 查看详情

关于activity

Activity与界面        1.Activity相当于浏览器的标签。相当于空白的网页,界面相当于浏览器内的网页。        2.将Activity与界面绑定就相当于在浏览器内填写了相应的网页... 查看详情

如何在 Activity(非 AppCompatActivity)中打开片段?

】如何在Activity(非AppCompatActivity)中打开片段?【英文标题】:HowtoopenafragmentinaActivity(non-AppCompatAcitivity)?【发布时间】:2020-11-1521:25:35【问题描述】:正如标题所述,我想打开一个位于Activity(NonAppCompatActivity)中的Fragment代码:Tab... 查看详情

如何在view中取得activity对象

参考技术A今天想实现在view中返回上一个activity的功能,想了半天。因为在虽然view是包含于一个activity的,但是直接在view中用this取得的对象不是activity而是这个view,直接写activity的名字也不行。于是找到了这个方法并附上!首先... 查看详情

如何在 Fragment 和未附加的 Activity 之间进行通信?

】如何在Fragment和未附加的Activity之间进行通信?【英文标题】:HowtocommunicatebetweenaFragmentandanActivitytowhichitisnotattached?【发布时间】:2015-11-1213:38:51【问题描述】:我想在片段上的onClick事件之后对Activity执行一些操作。我只发现了... 查看详情

从活动中获取片段内的按钮

...取片段内的按钮【英文标题】:getabuttonwithinafragmentfromtheactivity【发布时间】:2014-06-2820:34:33【问题描述】:我该怎么做?或者甚至有可能从activity获得fragment中的button?我尝试了很多东西,例如试图获取片段的视图或容器,但没... 查看详情

如何在不启动新 Activity 的情况下清除 Android 上的先前 Activity

】如何在不启动新Activity的情况下清除Android上的先前Activity【英文标题】:HowtoclearpreviousActivityonAndroidwithoutstartnewActivity【发布时间】:2021-10-2203:18:40【问题描述】:我想清除以前的活动,但没有在android上启动新活动。通常我在... 查看详情

如何在一个 Activity 中显示 listview 和 webview?

】如何在一个Activity中显示listview和webview?【英文标题】:HowtodisplayalistviewandawebviewinoneActivity?【发布时间】:2016-08-3002:51:36【问题描述】:所以我试图在一个Activity中实现两个API,并在同一个Activity中为我的第二个API显示listview和... 查看详情

如何在 Kotlin 中访问“Activity.this”?

】如何在Kotlin中访问“Activity.this”?【英文标题】:Howtoaccess"Activity.this"inKotlin?【发布时间】:2017-05-2718:55:22【问题描述】:我有这段Java代码:MaterialDialogbuilder=newMaterialDialog.Builder(MainActivity.this)我想在Kotlin中获取MainActivi... 查看详情

如何在适配器中启动 Activity?

】如何在适配器中启动Activity?【英文标题】:HowtostartActivityinadapter?【发布时间】:2011-05-1023:23:16【问题描述】:我有一个带有自定义适配器的ListActivity,在每个视图中,它可能有一些按钮,我需要在其中实现OnClickListener。我需... 查看详情

由于 Activity 重新创建,Progressdialog 无法关闭

】由于Activity重新创建,Progressdialog无法关闭【英文标题】:ProgressdialogfailstogetdismissedbecauseofActivityrecreate【发布时间】:2017-04-1000:59:02【问题描述】:我有一个对话框,它在Activity创建期间syasLoading和一个dialog.dismiss稍后在可运行... 查看详情

如何判断activity是否在前台显示

...android00/article/223.html我们在Android开发过程中,经常会判断Activity是否在前台显示,来处理某些状态,这里谢了一个静态方法,供大家参考。方法一:用ActivityManager管理的Activity栈来操作public class  CommonU 查看详情

在 Activity 重新创建时如何确定 Fragment 恢复?

】在Activity重新创建时如何确定Fragment恢复?【英文标题】:WhattodetermineaFragmentrestoreuponActivityre-create?【发布时间】:2013-03-1111:03:44【问题描述】:对于有ID的Views,调用super.onSaveInstanceState(outState);时会自动保存。对于添加到Activity... 查看详情

Activity 及其 Views 生命周期如何在 android 中重叠

】Activity及其Views生命周期如何在android中重叠【英文标题】:HowcanActivityanditsViewslifecyclesoverlapinandroid【发布时间】:2020-06-0817:16:33【问题描述】:android中有两个生命周期,基本上是一个Activity生命周期和一个ViewLifeCycle,但是ViewLi... 查看详情

如何在androidapp中设置系统语言

...果在设置界面打开切换语言的界面,选择语言后重启HomeActivity,语言切换完成,下次重新打开App,也是用户设置的语言。工具编程软件;实现步骤在不同的value文件夹下添加不同语言的 string.xml 文件,项目添加了英文、简... 查看详情

Android - 如何在非 Activity 类中使​​用 SharedPreferences?

】Android-如何在非Activity类中使​​用SharedPreferences?【英文标题】:Android-HowtouseSharedPreferencesinnon-Activityclass?【发布时间】:2011-11-2110:06:12【问题描述】:如何在非Activity类中使​​用SharedPreferences?我尝试制作一个通用的Preferenc... 查看详情

如何在 Android 上创建一个透明的 Activity?

】如何在Android上创建一个透明的Activity?【英文标题】:HowdoIcreateatransparentActivityonAndroid?【发布时间】:2011-01-1117:25:10【问题描述】:我想在另一个Activity之上创建一个透明的Activity。我怎样才能做到这一点?【问题讨论】:你... 查看详情