KotlinのRecyclerView itemClickListener [終了しました]。
2023-09-07 01:18:03
質問
私は3年間のAndroidの経験の後、Kotlinで最初のアプリを書いています。 ただ、KotlinでRecyclerViewでitemClickListenerを利用する方法について混乱しています。
私はtrait (edit: now interface) アプローチを試しましたが、非常に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(this@MainActivity, "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())
しかし、私はまだこれに満足していません。なぜなら、もっと良い、すっきりした方法があるのではないかと思うからです。私は本質的に次のようなことを実現しようとしています。 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)
}
}
下記の承認済み回答でLoopによる拡張機能。
fun <T : RecyclerView.ViewHolder> T.onClick(event: (view: View, position: Int, type: Int) -> Unit): T {
itemView.setOnClickListener {
event.invoke(it, getAdapterPosition(), getItemViewType())
}
return this
}
どのように解決するのですか?
少し変わった方法があります。ViewHolderの拡張機能を作成することができます。
fun <T : RecyclerView.ViewHolder> T.listen(event: (position: Int, type: Int) -> Unit): T {
itemView.setOnClickListener {
event.invoke(getAdapterPosition(), getItemViewType())
}
return this
}
そして、これをアダプタで次のように使います。
class MyAdapter : RecyclerView.Adapter<MyAdapter.MyViewHolder>() {
val items: MutableList<String> = arrayListOf()
override fun onCreateViewHolder(parent: ViewGroup?, viewType: Int): MyViewHolder? {
val inflater = LayoutInflater.from(parent!!.getContext())
val view = inflater.inflate(R.layout.item_view, parent, false)
return MyViewHolder(view).listen { pos, type ->
val item = items.get(pos)
//TODO do other stuff here
}
}
override fun onBindViewHolder(holder: MyViewHolder?, position: Int) {
}
override fun getItemCount(): Int {
return items.size()
}
class MyViewHolder(view: View) : RecyclerView.ViewHolder(view) {
}
}
私は同僚と一緒に ライブラリ を提供しています。
関連
-
[解決済み] RecyclerView onClick
-
[解決済み] Androidの連絡先リストを呼び出すには?
-
[解決済み] Androidのadb logcatでTAG名で特定のメッセージを除外する方法は?
-
[解決済み] Studio 3.4 をアップデートしたら、引数の leftShift() メソッドが見つかりませんでした。
-
[解決済み] 複数のフィルタを持つBroadcastReceiverか、複数のBroadcastReceiverか?
-
[解決済み] Android StudioからADBを手動で再起動する方法
-
[解決済み] FragmentPagerAdapterのgetItemが呼び出されない
-
[解決済み] キャンバスに複数行のテキストを描画する
-
[解決済み] BottomNavigationViewを新しいNavControllerで使用する際に、フラグメントを生かす方法はありますか?
-
[解決済み] 実行に失敗しました app:processDebugResources Android Studio
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] RecyclerView onClick
-
[解決済み] AndroidでラジオボタンにOnClickListenerを設定するには?
-
[解決済み] wrap_contentでRelativeLayoutがフルスクリーンになってしまう
-
[解決済み] EditTextの右側のDrawableにonClickListenerを設定する [重複] [重複
-
[解決済み] FragmentPagerAdapterのgetItemが呼び出されない
-
[解決済み] AsyncTaskLoaderとAsyncTaskの比較
-
[解決済み] LayoutParamsの高さを密度に依存しないピクセル数でプログラム的に設定する。
-
[解決済み] ViewPager2でスワイプを無効にするには?
-
[解決済み] アンドロイドボタンセレクター
-
[解決済み] RecyclerView Adapterの静的ビューホルダーと非静的ビューホルダーの違いは何ですか?