簡體   English   中英

Kotlin - onclicklistener 用於 recyclerview 到“詳細信息”片段

[英]Kotlin - onclicklistener for recyclerview to a "details" fragment

我試圖在單擊 recyclerview 項目時顯示另一個片段。 我已經添加了一個 onclicklistener,現在在 fragment.kt 上有一個 todo 部分,我需要知道如何讓它導航到一個新的片段

至於代碼,這是適配器:

class dormAdapter(
    private val dorms: List<Dorms>,
    private val listener: RecyclerViewClickListener
) : RecyclerView.Adapter<dormAdapter.DormViewHolder>() {

    override fun getItemCount() = dorms.size

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) =
        DormViewHolder(
            DataBindingUtil.inflate(
                LayoutInflater.from(parent.context),
                R.layout.layout_home,
                parent, false
            )
        )

    override fun onBindViewHolder(holder: DormViewHolder, position: Int) {
        holder.recyclerviewDormBinding.dorm = dorms[position]
        holder.recyclerviewDormBinding.buttonReserve.setOnClickListener {
            listener.onRecyclerViewItemClick(holder.recyclerviewDormBinding.buttonReserve, dorms[position])
        }
        holder.recyclerviewDormBinding.layoutBox.setOnClickListener {
            listener.onRecyclerViewItemClick(holder.recyclerviewDormBinding.layoutBox, dorms[position])
        }
    }

    inner class DormViewHolder(
        val recyclerviewDormBinding: LayoutHomeBinding
    ) : RecyclerView.ViewHolder(recyclerviewDormBinding.root)

}

這是登陸頁面上的片段:

class HomeFragment : Fragment(), RecyclerViewClickListener {

    private lateinit var factory: HomeViewModelFactory
    private lateinit var viewModel: HomeViewModel

    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
        return inflater.inflate(R.layout.fragment_home, container, false)
    }

    override fun onActivityCreated(savedInstanceState: Bundle?) {
        super.onActivityCreated(savedInstanceState)

        val api = DormsAPI()
        val repository = DormRepository(api)

        factory = HomeViewModelFactory(repository)
        viewModel = ViewModelProviders.of(this, factory).get(HomeViewModel::class.java)

        viewModel.getDorms()

        viewModel.dorms.observe(viewLifecycleOwner, Observer { dorms ->
            recyclerViewDorms.also{
                it.layoutManager = LinearLayoutManager(requireContext())
                it.setHasFixedSize(true)
                it.adapter = dormAdapter(dorms, this)
            }
        })
    }

    override fun onRecyclerViewItemClick(view: View, dorms: Dorms) {
        when(view.id){
            R.id.button_reserve -> {
                **// TODO: Go to new account if not signed up, etc...**
                Toast.makeText(requireContext(), "Reserve button clicked", Toast.LENGTH_LONG).show()
            }
            R.id.layoutBox -> {
                **// TODO: Go to Dorm Details**
                Toast.makeText(requireContext(), "Go to dorm details", Toast.LENGTH_LONG).show()
            }
        }
    }
}

此問題所需的任何其他內容將在以后跟進。

巨大的編輯:現在添加了 Onclicklistener。 項目現在適用於 MVVM 架構。

1) 在 Adapter 類中聲明 mOnclicklistener 屬性

private val mOnClickListener: View.OnClickListener

init {
     mOnClickListener = View.OnClickListener { v ->
         Log.d("onclick of item")
     }
 }

2) 在 onBindViewHolder 函數中 setOnclick 監聽器

with(holder.mView) {
        setOnClickListener(mOnClickListener)
    }

暫無
暫無

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

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