ListView 中的 Kotlin 可点击按钮
Posted
技术标签:
【中文标题】ListView 中的 Kotlin 可点击按钮【英文标题】:Kotlin clickable button in ListView 【发布时间】:2021-02-09 12:01:51 【问题描述】:我正在制作一个 Kotlin 食谱应用程序,并且我有一个带有按钮的菜肴名称列表,用于查看将在列表视图中添加新菜肴时生成的菜肴。该按钮应该将用户导航到将显示菜谱的新活动。但是,该按钮不起作用。我尝试了一些建议的解决方案,但仍然不起作用。
列表的xml文件:
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_
android:layout_
android:background="@android:color/darker_gray"
tools:context=".ViewRecipe">
<ListView
android:id="@+id/recipeList"
android:layout_
android:layout_
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.5"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<TextView
android:id="@+id/textView2"
android:layout_
android:layout_
android:layout_marginTop="39dp"
android:text="Recipe List"
android:textSize="18sp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.5"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
按钮的xml:
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_
android:layout_
tools:context=".Recipes">
<TextView
android:id="@+id/recipeView2"
android:layout_
android:layout_
android:layout_marginStart="23dp"
android:layout_marginTop="47dp"
android:text="TextView"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<Button
android:id="@+id/recipeDetails"
android:layout_
android:layout_
android:layout_marginTop="33dp"
android:layout_marginEnd="20dp"
android:text="View"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
用于列表视图的 Kotlin 文件:
package com.example.recipeapp
import android.content.Intent
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.widget.Button
import android.widget.ListView
import com.google.firebase.database.*
class ViewRecipe : AppCompatActivity()
lateinit var ref: DatabaseReference
lateinit var recipeList: MutableList<AddRecipeModelClass>
lateinit var listView: ListView
override fun onCreate(savedInstanceState: Bundle?)
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_view_recipe)
recipeList = mutableListOf()
ref = FirebaseDatabase.getInstance().getReference("addRecipes")
listView = findViewById(R.id.recipeList)
ref.addValueEventListener(object: ValueEventListener
override fun onCancelled(error: DatabaseError)
TODO("Not yet implemented")
override fun onDataChange(snapshot: DataSnapshot)
if (snapshot.exists())
recipeList.clear()
for(h in snapshot.children)
val recipe = h.getValue(AddRecipeModelClass::class.java)
recipeList.add(recipe!!)
val adapter = RecipeAdapter(applicationContext, R.layout.activity_recipes, recipeList)
listView.adapter = adapter
);
按钮的 Kotlin 文件:
package com.example.recipeapp
import android.content.Intent
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.widget.Button
class Recipes : AppCompatActivity()
override fun onCreate(savedInstanceState: Bundle?)
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_recipes)
val navView = findViewById<Button>(R.id.recipeDetails)
navView.setOnClickListener
val intent = Intent(this, RecipeDetails::class.java)
startActivity(intent)
RecipeAdapter.kt
package com.example.recipeapp
import android.content.Context
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.ArrayAdapter
import android.widget.TextView
class RecipeAdapter(val mCtx: Context, val layoutResId: Int, val recipeList: List<AddRecipeModelClass>)
: ArrayAdapter<AddRecipeModelClass>(mCtx, layoutResId, recipeList)
override fun getView(position: Int, convertView: View?, parent: ViewGroup): View
val layoutInflater: LayoutInflater = LayoutInflater.from(mCtx)
val view: View = layoutInflater.inflate(layoutResId, null)
val recipeView = view.findViewById<TextView>(R.id.recipeView2)
val recipe = recipeList[position]
recipeView.text = recipe.dishName
return view
编辑:
我发现问题正在发生,因为“查看”按钮位于列表视图中。我尝试使用放置在列表视图之外的“按钮”,它工作得很好。我无法使用在互联网上找到的解决方案来解决它。
图片显示了两种类型的按钮。视图在列表视图中,按钮在列表视图之外。
任何帮助将不胜感激。
【问题讨论】:
你能发布错误日志吗? 我没有看到任何错误显示,当我点击按钮时没有任何反应 能否贴出适配器类的代码 @Sharvin 我的回答能解决你的问题吗?你还面临同样的问题吗? @LakhwinderSingh 我已经添加了。 【参考方案1】:我没有阅读您的全部代码,但我发现的一个问题是:
navView.setOnClickListener
val intent = Intent(this, RecipeDetails::class.java)
// ^^^^
startActivity(intent)
该范围内的this
指的是传递给setOnclickListener
函数的View.OnClickListener
对象。不适用于应用程序上下文。
来自kotlin docs:
从外部范围(类或扩展函数,或 带有接收器的标记函数字面量)我们写 this@label where @label 是范围上的标签,这意味着它来自
所以你应该这样做:
navView.setOnClickListener
val intent = Intent(this@Recipes, RecipeDetails::class.java)
// ^^^^ note the label @Recipes
startActivity(intent)
或者,您可以在View.OnClickListener
的对象外部调用Intent
构造函数,在onCreate
函数中:
val intent = Intent(this, RecipeDetails::class.java)
val navView = findViewById<Button>(R.id.recipeDetails)
navView.setOnClickListener
startActivity(intent)
【讨论】:
我尝试了两种建议的方法,但仍然面临同样的问题【参考方案2】:把它放在你的活动类中,并确保你的 AddRecipeModelClass 是可打包的
private val onItemAction: (AddRecipeModelClass) -> Unit = it ->
val intent = Intent(this@ViewRecipe , RecipeDetails::class.java)
intent.putExtra("recipe", it)
startActivity(intent)
从新活动的意图中获取配方
为你的适配器 getView 添加一个点击监听器
class RecipeAdapter(val mCtx: Context, val layoutResId: Int,
val recipeList: List<AddRecipeModelClass>,private val onItemSelected: (AddRecipeModelClass) -> Unit?)
: ArrayAdapter<AddRecipeModelClass>(mCtx, layoutResId, recipeList)
override fun getView(position: Int, convertView: View?, parent: ViewGroup): View
val layoutInflater: LayoutInflater = LayoutInflater.from(mCtx)
val view: View = layoutInflater.inflate(layoutResId, null)
val recipeView = view.findViewById<TextView>(R.id.recipeView2)
val btn= findViewById<Button>(R.id.recipeDetails)
val recipe = recipeList[position]
btn.setOnClickListener
onItemSelected(recipe)
recipeView.text = recipe.dishName
return view
向构造函数添加函数
val adapter = RecipeAdapter(applicationContext, R.layout.activity_recipes, recipeList,onItemAction)
【讨论】:
以上是关于ListView 中的 Kotlin 可点击按钮的主要内容,如果未能解决你的问题,请参考以下文章
如何根据 android studio 中的 listview 项目点击更改活动图像和文本? java 或 kotlin
可点击元素的 ListView 中的 Android LongClick
使用 Kotlin 从 Android 上 ViewModel 中的 LiveData 更新 ListView 中的元素
Flutter Parallax Scroll 中的按钮不可点击
c# winform 点击按钮 将指定路径下的文件夹显示到listview中,并且listview中 文件夹可打开继续选择文件