2017-09-06 16 views
-1

インターフェイスを使用してクリックイベントを作成するにはどうすればよいですか?インターフェイスアンドロイドを使用してアダプタでonclickイベントを作成する方法は?

私のアプリケーションでは、アダプタのアイテムを親アクティビティにクリックしたことを検出するためにビューのクリックインタフェースを作成しました。私はこのインターフェイスを使用してビューリスナーを呼び出すことができますどのようにアダプタとインターフェイスとメソッドを作成した後?

+1

を作成しますか? https://kotlinlang.org/docs/reference/interfaces.html?いくつかのコードを共有できますか? –

+0

コードをアップロード –

+0

[インターフェイスは既にリスナーです]をクリックします。もう1つ追加しましたか? –

答えて

3

このコードを確認してください。うまくいきます。

最初にアダプタクラスを作成します。

class ChapterAdapter(private val activity: Activity, val mWords: ArrayList<Chapter>, val btnlistener: BtnClickListener) : RecyclerView.Adapter<ChapterAdapter.ViewHolder>() { 

     companion object { 
      var mClickListener: BtnClickListener? = null 
     } 

     override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder { 
      val layoutInflater = LayoutInflater.from(parent.context) 
      return ViewHolder(layoutInflater.inflate(R.layout.layout_capter_raw, parent, false)) 
     } 

     override fun onBindViewHolder(holder: ViewHolder?, position: Int) { 
      mClickListener = btnlistener 
      val item = mWords[position] 

      holder.layout_chapter_name.setOnClickListener(object : View.OnClickListener { 
       override fun onClick(v: View?) { 
        if (mClickListener != null) 
         mClickListener?.onBtnClick(position) 
       } 
      }) 
     } 

     override fun getItemCount(): Int { 
      return mWords.size 
     } 

     override fun getItemId(position: Int): Long { 
      return super.getItemId(position) 
     } 

     override fun getItemViewType(position: Int): Int { 
      return super.getItemViewType(position) 
     } 

     class ViewHolder(view: View) : RecyclerView.ViewHolder(view) { 
      val txt_capter_name = view.txt_capter_name 
     } 

     open interface BtnClickListener { 
      fun onBtnClick(position: Int) 
     } 
    } 

アクティビティまたはフラグメントにアダプタを作成して宣言した後。

+0

フルコールのコードではるかに良い – ios

+0

これはKotlinを使用する方法とは異なります。コンバータがjavaをkotlinに変換しようとすると、その方法は次のようになります。 –

+0

'mClickListener?.onBtnClick(position)'はヌルチェックの代わりに '!!'を使うべきです。そして、なぜあなたは 'BtnClickListener'をコンパニオンオブジェクトの中に入れますか? – BakaWaii

2

これを行う適切な方法は、Java Interfacesの代わりにコールバックを使用しています。例:

class MyAdapter(private val callback: (YourModel) -> Unit) { 

    override fun onBindViewHolder(holder: DataBoundViewHolder<YourModel>, position: Int) { 
     bind(holder.binding, items!![position]) 
     holder.binding.executePendingBindings() 
     holder.binding.root.setOnClickListener { callback(binding.model) } 
    } 
} 

とアダプタを作成し、どこか

MyAdapter myAdapter = MyAdapter({ println{"Clicked $it"} }) 

編集を使用して:アスカーiがスミットからのコードを使用してKotlin-コールバックとのインタフェースを置き換え完全に動作するコードを見てみたいので。

class ChapterAdapter(private val activity: Activity, 
    val mWords: ArrayList<Chapter>, 
    val callback: (Any) -> Unit) : 
    RecyclerView.Adapter<ChapterAdapter.ViewHolder>() { 


     override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder { 
      val layoutInflater = LayoutInflater.from(parent.context) 
      return ViewHolder(layoutInflater.inflate(R.layout.layout_capter_raw, parent, false)) 
     } 

     override fun onBindViewHolder(holder: ViewHolder?, position: Int) { 
      val item = mWords[position] 

      holder.layout_chapter_name.setOnClickListener(callback {$it}) 
     } 

     override fun getItemCount(): Int = mWords.size 

     override fun getItemId(position: Int): Long = super.getItemId(position) 

     override fun getItemViewType(position: Int): Int = super.getItemViewType(position) 


     class ViewHolder(view: View) : RecyclerView.ViewHolder(view) { 
      val txt_capter_name = view.txt_capter_name 
     } 

、最終的にはアダプタあなたは "インターフェース" とはどういう意味ですか

listAdapter = ChapterAdapter(activity, _arrChapterList, { 
    toast("Clicked $it", Toast.LENGTH_LONG) 
}) 
+0

ラムダ式を使用しています。これはショットソリューションです – ios

+0

Kotlin SAM-Type :-) –

+0

インターフェイスでどのようにできるか完全なコードを提供できますか? –

関連する問題