簡體   English   中英

Recyclerview的Kotlin新片段

[英]Kotlin new Fragment from Recyclerview

我正在嘗試從當前片段的RecyclerView Adapter中打開一個新片段。但是我不知道如何設置onClickListener。這是我的代碼

internal class ContentAdapter constructor (private var dataList: ArrayList<DataList>) : RecyclerView.Adapter<ContentAdapter.ViewHolder>(), View.OnClickListener {
    override fun onClick(v: View?) {
        val manager = activity.supportFragmentManager // I cannot resolve activity here 
        val transaction = manager.beginTransaction()
        val book = IndividualBook()
        transaction.add(android.R.id.content, book, "IndividualBook")
        transaction.addToBackStack(null)
        transaction.commit()
    }

    override fun getItemCount(): Int = dataList.size

    override fun onCreateViewHolder(parent: ViewGroup?, viewType: Int): ViewHolder {
        return ViewHolder(LayoutInflater.from(parent!!.context).inflate(R.layout.item,parent,false))
    }

    override fun onBindViewHolder(holder: ViewHolder?, position: Int) {
        holder!!.bind(dataList)
        holder.itemView.setOnClickListener(this)
    }

    class ViewHolder(itemView: View?) : RecyclerView.ViewHolder(itemView) {
        fun bind(DataList: ArrayList<DataList>){
            val dataList = DataList[adapterPosition]
            itemView.itemTitle.text = dataList.title
            Glide.with(itemView.context).load(dataList.image).into(itemView.itemImage)
            itemView.regPrice.text = dataList.regPrice
            itemView.regPrice.paintFlags = Paint.STRIKE_THRU_TEXT_FLAG
            itemView.splPrice.text = dataList.splPrice
        }
    }
}

幫我解決問題。

最好使用回調活動來導航到新片段。

將構造函數更改為

internal class ContentAdapter constructor (private var dataList: ArrayList<DataList>,private var callback:()->Unit) : RecyclerView.Adapter<ContentAdapter.ViewHolder>(), View.OnClickListener 

然后里面

override fun onClick(v: View?)

callback.invoke();

活動將通過設置適配器

val adapter = ContentAdapter(datalist)
{ // Code to navigate to new fragment

}
internal class ContentAdapter (private val activity: Activity, private var dataList: ArrayList<DataList>) : RecyclerView.Adapter<ContentAdapter.ViewHolder>(), View.OnClickListener

您需要在構造函數中傳遞活動。 對於Kotlin來說,還有一個不錯的獎勵提示:如果只有一個主構造函數,則不必編寫“ constructor”前綴

internal class ContentAdapter (private val activity: AppCompatActivity, private var dataList: ArrayList<DataList>) : RecyclerView.Adapter<ContentAdapter.ViewHolder>(), View.OnClickListener

活動完成后,您可以訪問管理員

您需要在構造函數中傳遞活動。如果只有一個主要構造函數,則不必編寫Kotlin技巧。

一些解決方案:

  1. Kotlin將所有類默認為static 您必須選擇加入他們作為inner類。 將類放入Activity中,然后將inner修飾符添加到類中:

     internal inner class ContentAdapter constructor (private var dataList: ArrayList<DataList>) : RecyclerView.Adapter<ContentAdapter.ViewHolder>(), View.OnClickListener { 
  2. 保持ContentAdapter static ,但將activity通過構造函數傳遞:

     internal class ContentAdapter( private val activity: AppCompatActivity, private var dataList: ArrayList<DataList> ) : RecyclerView.Adapter<ContentAdapter.ViewHolder>(), View.OnClickListener { 

看來您可能不熟悉Kotlin與Java的不同,並且默認將您編寫更好的代碼。 它可能會幫助您完整閱讀Kotlin文檔。 時間不長 我還推薦Kotlin Koans,這是JetBrains提供的用於練習Kotlin的編碼練習。

Kotlin是對Java的巨大改進:-)不要讓這種情況阻止您!

(順便說一句,您似乎可以將dataListval 。當引用為final時,始終首選val而不是var 。)

使用Onclick作為onClickListener的替代方法,您可以像這樣使用onClick。

 itemView.regPrice.onClick {
/ * your action */
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM