[英]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技巧。
一些解決方案:
Kotlin將所有類默認為static
。 您必須選擇加入他們作為inner
類。 將類放入Activity中,然后將inner
修飾符添加到類中:
internal inner class ContentAdapter constructor (private var dataList: ArrayList<DataList>) : RecyclerView.Adapter<ContentAdapter.ViewHolder>(), View.OnClickListener {
保持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的巨大改進:-)不要讓這種情況阻止您!
(順便說一句,您似乎可以將dataList
為val
。當引用為final
時,始終首選val
而不是var
。)
使用Onclick作為onClickListener的替代方法,您可以像這樣使用onClick。
itemView.regPrice.onClick {
/ * your action */
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.