我在用Android 3年的經驗後,在Kotlin編寫我的第一個應用程序。 只是混淆瞭如何在Kotlin中使用帶有RecyclerView的itemClickListener。Kotlin的RecyclerView itemClickListener
我試圖性狀(編輯:現在接口)的做法,非常類似Java的
public class MainActivity : ActionBarActivity() {
protected override fun onCreate(savedInstanceState: Bundle?) {
// set content view etc go above this line
class itemClickListener : ItemClickListener {
override fun onItemClick(view: View, position: Int) {
Toast.makeText([email protected], "TEST: " + position, Toast.LENGTH_SHORT).show()
}
}
val adapter = DrawerAdapter(itemClickListener())
mRecyclerView.setAdapter(adapter)
}
trait ItemClickListener {
fun onItemClick(view: View, position: Int)
}
}
這似乎很冗餘,所以我嘗試了內部類的方法:
inner class ItemClickListener {
fun onItemClick(view: View, position: Int) {
startActivityFromFragmentForResult<SelectExerciseActivity>(SELECT_EXERCISES)
}
}
然後就是設置適配器的點擊監聽器是這樣的:
val adapter = WorkoutsAdapter(ItemClickListener())
但我仍然不滿意th是因爲我認爲可能會有更好,更乾淨的方式。我試圖基本實現這樣的事情: RecyclerView onClick
有什麼建議嗎?
結束了自定義的功能活性的批准答案
的變化會:
val itemOnClick: (View, Int, Int) -> Unit = { view, position, type ->
Log.d(TAG, "test")
}
傳遞的函數本身的適配器是這樣的:
class ExercisesAdapter(val itemClickListener: (View, Int, Int) -> Unit) : RecyclerView.Adapter<RecyclerView.ViewHolder>() {
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder {
// other stuff up here
val vhExercise = ExerciseVH(view) // view holder
// on to the view holder through the extension function
vhExercise.onClick(itemClickListener)
}
}
通過下面批准的答案循環擴展功能。
fun <T : RecyclerView.ViewHolder> T.onClick(event: (view: View, position: Int, type: Int) -> Unit): T {
itemView.setOnClickListener {
event.invoke(it, getAdapterPosition(), getItemViewType())
}
return this
}
如何在您的活動中調用擴展函數onClick – YLS 2017-11-17 09:36:39
在適配器的構造函數中設置itemClickListener(在此示例中爲itemOnClick)。 ViewHolder調用它。事後看來,這仍然有效,我應該使用這個更多的大聲笑。這些天每次都要繼續製作手動的onClick方法。 – AfzalivE 2018-01-22 22:29:02