Kotlin Recycler 查看 ItemClick to new Intent
Kotlin Recyclerview ItemClick to new Intent
我有问题。当我点击 Recyclerview 中的任何项目时,我可以打印一条消息。但我想在单击时切换到不同的 activity。你能以一种非常具体的方式帮助我吗?这对我来说是一个非常重要的项目。我写的代码块如下。提前致谢。
客户适配器
class 客户适配器(私有值 companynameArray:ArrayList,私有值 companyoffArray:ArrayList,私有值 companyPhoneArray:ArrayList):
RecyclerView.Adapter() {
class CustomerHolder(view: View) : RecyclerView.ViewHolder(view) {
var recycleCompanyName: TextView?=null
var recycleOffName: TextView?=null
var recycleOffPhone: TextView?=null
init {
recycleCompanyName=view.findViewById(R.id.recycleCompanyName)
recycleOffName=view.findViewById(R.id.recycleOffName)
recycleOffPhone=view.findViewById(R.id.recycleOffPhone)
itemView.setOnClickListener {
}
}
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): CustomerHolder {
val inflater= LayoutInflater.from(parent.context)
val view= inflater.inflate(R.layout.recycler_view_customer_row,parent,false)
return CustomersAdapter.CustomerHolder(view)
}
override fun getItemCount(): Int {
return companynameArray.size
}
override fun onBindViewHolder(holder: CustomerHolder, position: Int) {
holder.recycleCompanyName?.text="Şirket Adı:"+companynameArray[position]
holder.recycleOffName?.text="Şirket Yetkilisi :"+companyoffArray[position]
holder.recycleOffPhone?.text="İrtibat No : "+companyPhoneArray[position]
}
}
我没有指定activity我想去的。如果您能提供帮助,我将不胜感激。
如果有帮助,我把客户端的代码写在这里class
class 客户:AppCompatActivity()
{
private lateinit var auth: FirebaseAuth
private lateinit var db: FirebaseFirestore
var companynameFB:ArrayList<String> = ArrayList()
var companyoffFB:ArrayList<String> = ArrayList()
var companyphoneFB:ArrayList<String> = ArrayList()
var adapter :CustomersAdapter?=null
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_customers)
auth= FirebaseAuth.getInstance()
db= FirebaseFirestore.getInstance()
getDataFromFirestore()
var layoutManager= LinearLayoutManager(this)
recyclerView.layoutManager=layoutManager
adapter= CustomersAdapter(companynameFB,companyoffFB,companyphoneFB)
recyclerView.adapter=adapter
}
fun getDataFromFirestore(){
db.collection("Customers")
.addSnapshotListener { snapshot, exception ->
if(exception!=null){
Toast.makeText(applicationContext,exception.localizedMessage.toString(),Toast.LENGTH_LONG).show()
}else{
if(snapshot!=null){
if (!snapshot.isEmpty){
companynameFB.clear()
companyoffFB.clear()
companyphoneFB.clear()
val documents=snapshot.documents
for (document in documents){
val compname=document.get("compname") as String
val compoff=document.get("compoff") as String
val compphone=document.get("compphone") as String
val user=document.get("user") as String
val timeStamp=document.get("date") as Timestamp
val date=timeStamp.toDate()
companynameFB.add(compname)
companyoffFB.add(compoff)
companyphoneFB.add(compphone)
adapter!!.notifyDataSetChanged()
}
}
}
}
}
}
override fun onCreateOptionsMenu(menu: Menu?): Boolean {
val menuInflater=getMenuInflater()
menuInflater.inflate(R.menu.add_customer,菜单)
return super.onCreateOptionsMenu(menu)
}
override fun onOptionsItemSelected(item: MenuItem): Boolean {
if(item.itemId==R.id.add){
val intent= Intent(this,AddCustomers::class.java)
intent.putExtra("信息","新")
开始活动(意图)
}
return super.onOptionsItemSelected(item)
}
将您的点击侦听器放在 onBindViewHolder
方法中
override fun onBindViewHolder(holder: CustomerHolder, position: Int) {
holder.recycleCompanyName?.text="Şirket Adı:"+companynameArray[position]
holder.recycleOffName?.text="Şirket Yetkilisi :"+companyoffArray[position]
holder.recycleOffPhone?.text="İrtibat No : "+companyPhoneArray[position]
holder.itemView.setOnClickListener {
// do what ever you want here
holder.itemView.context.startActivity( /*your intent here*/)
}
}
}
第 1 步:在此处传递上下文
class CustomersAdapter(val context:Context,private val
companynameArray:ArrayList,private val
companyoffArray:ArrayList, private val companyPhoneArray:ArrayList):
RecyclerView.Adapter<CustomersAdapter.CustomerHolder>() {
第 2 步:
itemView.setOnClickListener {
val intent=Intent(context,yourActivity::java.class)
startActivity(intent)
}
你需要一个 context 的意图,这样你就可以从 activity 或 片段中得到它 与此 适配器 相关联并将其传递给您的意图,或者您可以像这样从展开的布局中的任何视图中获取它
val context=holder.title.context
val intent = Intent( context, EventDetail::class.java)
context.startActivity(intent)
要开始一个新的 Activity,您至少需要一个上下文实例。正如此处的其他一些答案所写,您可以使用视图的上下文直接在 ViewHolder
内启动 activity。但为了更好地分离责任,我建议您将导航移至您的 Fragment/Activity
,所有其他导航都发生在该位置。这样你就知道 Activity/Fragment
的外观,可以从该屏幕完成哪些导航,并且你不需要搜索 Adapter
或 ViewHolder
中发生的一些隐藏导航。此外,如果您需要执行 startActivityForResult
,那么 Context
的实例不足以执行此操作。为此,您需要一个 Activity
或 Fragment
实例,我们还有另一个理由将所有导航放在那里。
所以你可以这样做:
将 LAMBDA 添加到适配器构造函数:
class CustomersAdapter(private val companynameArray: ArrayList,
private val companyoffArray: ArrayList,
private val companyPhoneArray: ArrayList,
private val onItemClick: () -> Unit) : RecyclerView.Adapter<CustomersAdapter.CustomerHolder>() {
注意:将 lambda 作为最后一个构造函数参数。
将 LAMBDA 添加到 VIEWHOLDER 构造函数:
class CustomerHolder(view: View,
private val onItemClick: () -> Unit) : RecyclerView.ViewHolder(view) {
修改 VIEWHOLDER 构造函数调用:
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): CustomerHolder {
val inflater = LayoutInflater.from(parent.context)
val view = inflater.inflate(R.layout.recycler_view_customer_row,parent,false)
return CustomersAdapter.CustomerHolder(view, onItemClick) //Add onItemClick lambda instance from adapter here
}
单击时调用 LAMBDA:
itemView.setOnClickListener {
onItemClick()
}
修复适配器构造函数调用:
val adapter = CustomersAdapter(companynameArray, companyoffArray, companyPhoneArray) {
startActivity() // do your navigation here
}
为什么我们将 lambda 作为适配器中构造函数的最后一个参数?如果函数的最后一个参数是一个函数,那么作为相应参数传递的 lambda 表达式可以放在括号外(SOURCE)。我们在上面处理导航的最后一段代码中正是这样做的。
我有问题。当我点击 Recyclerview 中的任何项目时,我可以打印一条消息。但我想在单击时切换到不同的 activity。你能以一种非常具体的方式帮助我吗?这对我来说是一个非常重要的项目。我写的代码块如下。提前致谢。
客户适配器
class 客户适配器(私有值 companynameArray:ArrayList,私有值 companyoffArray:ArrayList,私有值 companyPhoneArray:ArrayList):
RecyclerView.Adapter
class CustomerHolder(view: View) : RecyclerView.ViewHolder(view) {
var recycleCompanyName: TextView?=null
var recycleOffName: TextView?=null
var recycleOffPhone: TextView?=null
init {
recycleCompanyName=view.findViewById(R.id.recycleCompanyName)
recycleOffName=view.findViewById(R.id.recycleOffName)
recycleOffPhone=view.findViewById(R.id.recycleOffPhone)
itemView.setOnClickListener {
}
}
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): CustomerHolder {
val inflater= LayoutInflater.from(parent.context)
val view= inflater.inflate(R.layout.recycler_view_customer_row,parent,false)
return CustomersAdapter.CustomerHolder(view)
}
override fun getItemCount(): Int {
return companynameArray.size
}
override fun onBindViewHolder(holder: CustomerHolder, position: Int) {
holder.recycleCompanyName?.text="Şirket Adı:"+companynameArray[position]
holder.recycleOffName?.text="Şirket Yetkilisi :"+companyoffArray[position]
holder.recycleOffPhone?.text="İrtibat No : "+companyPhoneArray[position]
}
}
我没有指定activity我想去的。如果您能提供帮助,我将不胜感激。
如果有帮助,我把客户端的代码写在这里class
class 客户:AppCompatActivity()
{
private lateinit var auth: FirebaseAuth
private lateinit var db: FirebaseFirestore
var companynameFB:ArrayList<String> = ArrayList()
var companyoffFB:ArrayList<String> = ArrayList()
var companyphoneFB:ArrayList<String> = ArrayList()
var adapter :CustomersAdapter?=null
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_customers)
auth= FirebaseAuth.getInstance()
db= FirebaseFirestore.getInstance()
getDataFromFirestore()
var layoutManager= LinearLayoutManager(this)
recyclerView.layoutManager=layoutManager
adapter= CustomersAdapter(companynameFB,companyoffFB,companyphoneFB)
recyclerView.adapter=adapter
}
fun getDataFromFirestore(){
db.collection("Customers")
.addSnapshotListener { snapshot, exception ->
if(exception!=null){
Toast.makeText(applicationContext,exception.localizedMessage.toString(),Toast.LENGTH_LONG).show()
}else{
if(snapshot!=null){
if (!snapshot.isEmpty){
companynameFB.clear()
companyoffFB.clear()
companyphoneFB.clear()
val documents=snapshot.documents
for (document in documents){
val compname=document.get("compname") as String
val compoff=document.get("compoff") as String
val compphone=document.get("compphone") as String
val user=document.get("user") as String
val timeStamp=document.get("date") as Timestamp
val date=timeStamp.toDate()
companynameFB.add(compname)
companyoffFB.add(compoff)
companyphoneFB.add(compphone)
adapter!!.notifyDataSetChanged()
}
}
}
}
}
}
override fun onCreateOptionsMenu(menu: Menu?): Boolean {
val menuInflater=getMenuInflater() menuInflater.inflate(R.menu.add_customer,菜单)
return super.onCreateOptionsMenu(menu)
}
override fun onOptionsItemSelected(item: MenuItem): Boolean {
if(item.itemId==R.id.add){
val intent= Intent(this,AddCustomers::class.java)
intent.putExtra("信息","新") 开始活动(意图)
}
return super.onOptionsItemSelected(item)
}
将您的点击侦听器放在 onBindViewHolder
方法中
override fun onBindViewHolder(holder: CustomerHolder, position: Int) {
holder.recycleCompanyName?.text="Şirket Adı:"+companynameArray[position]
holder.recycleOffName?.text="Şirket Yetkilisi :"+companyoffArray[position]
holder.recycleOffPhone?.text="İrtibat No : "+companyPhoneArray[position]
holder.itemView.setOnClickListener {
// do what ever you want here
holder.itemView.context.startActivity( /*your intent here*/)
}
}
}
第 1 步:在此处传递上下文
class CustomersAdapter(val context:Context,private val
companynameArray:ArrayList,private val
companyoffArray:ArrayList, private val companyPhoneArray:ArrayList):
RecyclerView.Adapter<CustomersAdapter.CustomerHolder>() {
第 2 步:
itemView.setOnClickListener {
val intent=Intent(context,yourActivity::java.class)
startActivity(intent)
}
你需要一个 context 的意图,这样你就可以从 activity 或 片段中得到它 与此 适配器 相关联并将其传递给您的意图,或者您可以像这样从展开的布局中的任何视图中获取它
val context=holder.title.context
val intent = Intent( context, EventDetail::class.java)
context.startActivity(intent)
要开始一个新的 Activity,您至少需要一个上下文实例。正如此处的其他一些答案所写,您可以使用视图的上下文直接在 ViewHolder
内启动 activity。但为了更好地分离责任,我建议您将导航移至您的 Fragment/Activity
,所有其他导航都发生在该位置。这样你就知道 Activity/Fragment
的外观,可以从该屏幕完成哪些导航,并且你不需要搜索 Adapter
或 ViewHolder
中发生的一些隐藏导航。此外,如果您需要执行 startActivityForResult
,那么 Context
的实例不足以执行此操作。为此,您需要一个 Activity
或 Fragment
实例,我们还有另一个理由将所有导航放在那里。
所以你可以这样做:
将 LAMBDA 添加到适配器构造函数:
class CustomersAdapter(private val companynameArray: ArrayList,
private val companyoffArray: ArrayList,
private val companyPhoneArray: ArrayList,
private val onItemClick: () -> Unit) : RecyclerView.Adapter<CustomersAdapter.CustomerHolder>() {
注意:将 lambda 作为最后一个构造函数参数。
将 LAMBDA 添加到 VIEWHOLDER 构造函数:
class CustomerHolder(view: View,
private val onItemClick: () -> Unit) : RecyclerView.ViewHolder(view) {
修改 VIEWHOLDER 构造函数调用:
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): CustomerHolder {
val inflater = LayoutInflater.from(parent.context)
val view = inflater.inflate(R.layout.recycler_view_customer_row,parent,false)
return CustomersAdapter.CustomerHolder(view, onItemClick) //Add onItemClick lambda instance from adapter here
}
单击时调用 LAMBDA:
itemView.setOnClickListener {
onItemClick()
}
修复适配器构造函数调用:
val adapter = CustomersAdapter(companynameArray, companyoffArray, companyPhoneArray) {
startActivity() // do your navigation here
}
为什么我们将 lambda 作为适配器中构造函数的最后一个参数?如果函数的最后一个参数是一个函数,那么作为相应参数传递的 lambda 表达式可以放在括号外(SOURCE)。我们在上面处理导航的最后一段代码中正是这样做的。