2017-11-08 12 views
0

私はJavaからKotlinに自分のアプリを変換しようとしていました。Kotlin - メンバー宣言を期待しています

Androidスタジオ内蔵コンバータを使用して、発生したエラーのほとんどを修正しました。

は、この1つは私に本当にハード時間を与えているKotlinする新しいビーイング:

私はJavaで書かれたと明らかに私はRecyclerViewでアイテムのクリックを管理することができます任意のエラー、なし、変換しまったこのクラスを得ました:

ItemClickSupport.addTo(recyclerView!!).setOnItemClickListener { recyclerView, position, v -> 
      val itemIntent = Intent([email protected], CreateSubscription::class.java) 

      ... 
     } 

のTh:それはonCreate機能で、次のように設定されています、変換後の主な活動で

class ItemClickSupport private constructor(private val mRecyclerView: RecyclerView) { 
    private var mOnItemClickListener: OnItemClickListener? = null 
    private var mOnItemLongClickListener: OnItemLongClickListener? = null 
    private val mOnClickListener = View.OnClickListener { v -> 
     if (mOnItemClickListener != null) { 
      val holder = mRecyclerView.getChildViewHolder(v) 
      mOnItemClickListener!!.onItemClicked(mRecyclerView, holder.adapterPosition, v) 
     } 
    } 

    private val mOnLongClickListener = View.OnLongClickListener { v -> 
     if (mOnItemLongClickListener != null) { 
      val holder = mRecyclerView.getChildViewHolder(v) 
      [email protected] mOnItemLongClickListener!!.onItemLongClicked(mRecyclerView, holder.adapterPosition, v) 
     } 
     false 
    } 

    private val mAttachListener = object : RecyclerView.OnChildAttachStateChangeListener { 
     override fun onChildViewAttachedToWindow(view: View) { 
      if (mOnItemClickListener != null) { 
       view.setOnClickListener(mOnClickListener) 
      } 
      if (mOnItemLongClickListener != null) { 
       view.setOnLongClickListener(mOnLongClickListener) 
      } 
     } 

     override fun onChildViewDetachedFromWindow(view: View) { 

     } 
    } 

    init { 
     mRecyclerView.setTag(R.id.item_click_support, this) 
     mRecyclerView.addOnChildAttachStateChangeListener(mAttachListener) 
    } 

    fun setOnItemClickListener(listener: OnItemClickListener): ItemClickSupport { 
     mOnItemClickListener = listener 
     return this 
    } 

    fun setOnItemLongClickListener(listener: OnItemLongClickListener): ItemClickSupport { 
     mOnItemLongClickListener = listener 
     return this 
    } 

    private fun detach(view: RecyclerView) { 
     view.removeOnChildAttachStateChangeListener(mAttachListener) 
     view.setTag(R.id.item_click_support, null) 
    } 

    interface OnItemClickListener { 

     fun onItemClicked(recyclerView: RecyclerView, position: Int, v: View) 
    } 

    interface OnItemLongClickListener { 

     fun onItemLongClicked(recyclerView: RecyclerView, position: Int, v: View): Boolean 
    } 

    companion object { 

     fun addTo(view: RecyclerView): ItemClickSupport { 
      var support: ItemClickSupport? = view.getTag(R.id.item_click_support) as ItemClickSupport 
      if (support == null) { 
       support = ItemClickSupport(view) 
      } 
      return support 
     } 

     fun removeFrom(view: RecyclerView): ItemClickSupport? { 
      val support = view.getTag(R.id.item_click_support) as ItemClickSupport 
      support?.detach(view) 
      return support 
     } 
    } 
} 

Type mismatch:

required: ItemClickSupport.OnItemClickListener

Found: (???, ???, ???) -> Unit

は今、私はUnitはKotlinのvoidですけど、エラーがどこにあるか私は理解することはできません:E IDEは私に次のエラーを与えています。

提案されているようthis answerをチェックした後、私は次のコードを書いた:

ItemClickSupport.addTo(recyclerView!!).setOnItemClickListener(
       object: ItemClickSupport.OnItemClickListener { 
        val itemIntent = Intent([email protected], CreateSubscription::class.java) 
        val bundle = Bundle() 
        bundle.putParcelable("selected", filteredList!![position]) 
        itemIntent.putExtras(bundle) 
        startActivity(itemIntent) 
     }) 

は今、私はそれがコンストラクタに関係しているthis other answerに述べたように

expected member declaration

を取得しています。

これはItemClickSupport.OnItemClickListenerコンストラクタですか?もしそうなら、私は何を変えるべきですか?

私はエラーがまだあなたがKotlinに両方のファイルを変換したのでとOnItemClickListenerインタフェースがで書かれているとして、それがどのsintaxエラー

+0

オブジェクト内でオーバーライドする関数を宣言する必要があります。 –

答えて

2

を持っていない場合でも、悪いkotlinに変換されOnClickSupportクラスによって引き起こされている疑いがありますKotlin、あなたはそのような関数lambdaを渡すことはできません。 最良の方法はまた

ItemClickSupport.addTo(recyclerView!!) 
    .setOnItemClickListener (object:OnItemClickListener{ 
     override fun onItemClicked(recyclerView: RecyclerView, position: Int, v: View){ 
      val itemIntent = Intent([email protected], CreateSubscription::class.java) 
      ... 
     } 
    }) 

(あなたはまた、そのためにラムダを使用することができますが、私は理解のためにラムダずに掲示しています)インターフェイスの匿名のインスタンスを作成することで、あなたはにItemClickSupport内の高位機能を使用することができますラムダのみを受け取り、インターフェースを避ける。

+0

答えをありがとう。これはほぼ間違いなく、パラメータの型を宣言し、onItemClicked関数をオーバーライドする必要がありました。それは最後に働いた – Daniele

関連する問題