如何从Kotlin中的一个片段调用adapter中的一个方法?

xuo3flqw  于 2022-12-23  发布在  Kotlin
关注(0)|答案(3)|浏览(228)

我一直试图调用一个函数从片段到适配器,但我不能接近它的权利。我想看不见的按钮出现在片段从适配器。

  1. **My Adapter Code:**
  2. package com.littleboo.brandlogo.Adapters
  3. import android.R
  4. import android.content.Context
  5. import android.content.Intent
  6. import android.graphics.Color
  7. import android.graphics.drawable.ColorDrawable
  8. import android.net.Uri
  9. import android.os.Build
  10. import android.os.VibrationEffect
  11. import android.os.Vibrator
  12. import android.view.LayoutInflater
  13. import android.view.View
  14. import android.view.ViewGroup
  15. import android.view.animation.Animation
  16. import android.view.animation.AnimationUtils
  17. import android.widget.Button
  18. import android.widget.TextView
  19. import android.widget.Toast
  20. import androidx.appcompat.app.AlertDialog
  21. import androidx.core.content.ContextCompat.getSystemService
  22. import androidx.recyclerview.widget.RecyclerView
  23. import com.littleboo.brandlogo.Fragments.QuizFragment
  24. import com.littleboo.brandlogo.MainActivity
  25. import com.littleboo.brandlogo.Models.Question
  26. import com.littleboo.brandlogo.databinding.ActivityMainBinding.inflate
  27. import com.littleboo.brandlogo.databinding.FragmentQuizBinding
  28. import kotlinx.coroutines.NonDisposableHandle.parent
  29. class QuestionAdap(val context: Context, val question: Question) :
  30. RecyclerView.Adapter<QuestionAdap.OptionViewHolder>() {
  31. var index = 1
  32. var score = 0
  33. val animShake: Animation = AnimationUtils.loadAnimation(context, com.littleboo.brandlogo.R.anim.shake)
  34. private var options: List<String> = listOf(question.option1, question.option2, question.option3, question.option4)
  35. inner class OptionViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView){
  36. var optionView = itemView.findViewById<TextView>(com.littleboo.brandlogo.R.id.quiz_option)
  37. }
  38. override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): OptionViewHolder {
  39. val view = LayoutInflater.from(context).inflate(com.littleboo.brandlogo.R.layout.quizoptions, parent, false)
  40. return OptionViewHolder(view)
  41. }
  42. override fun onBindViewHolder(holder: OptionViewHolder, position: Int) {
  43. holder.optionView.text = options[position]
  44. holder.itemView.setOnClickListener {
  45. question.userAnswer = options[position]
  46. notifyDataSetChanged()
  47. }
  48. if(question.userAnswer == options[position] && question.userAnswer == question.answer){
  49. holder.itemView.setBackgroundResource(com.littleboo.brandlogo.R.drawable.option_item_selected_bg)
  50. score += 10
  51. Toast.makeText(context,"Score is $score", Toast.LENGTH_SHORT).show()
  52. }
  53. else if(question.userAnswer == options[position] && question.userAnswer != question.answer){
  54. holder.itemView.setBackgroundResource(com.littleboo.brandlogo.R.drawable.wrong_option_item_selected_bg)
  55. holder.itemView.startAnimation(animShake)
  56. }
  57. else{
  58. holder.itemView.setBackgroundResource(com.littleboo.brandlogo.R.drawable.non_option_item_selected_bg)
  59. }
  60. }
  61. override fun getItemCount(): Int {
  62. return options.size
  63. }
  64. }

我的测验片段代码:

  1. package com.littleboo.brandlogo.Fragments
  2. import android.os.Bundle
  3. import android.view.LayoutInflater
  4. import android.view.View
  5. import android.view.ViewGroup
  6. import android.widget.Button
  7. import androidx.fragment.app.Fragment
  8. import androidx.recyclerview.widget.LinearLayoutManager
  9. import androidx.recyclerview.widget.RecyclerView
  10. import androidx.swiperefreshlayout.widget.CircularProgressDrawable
  11. import com.bumptech.glide.Glide
  12. import com.google.firebase.firestore.FirebaseFirestore
  13. import com.littleboo.brandlogo.Adapters.QuestionAdap
  14. import com.littleboo.brandlogo.Models.Question
  15. import com.littleboo.brandlogo.Models.quizmodel
  16. import com.littleboo.brandlogo.R
  17. import com.littleboo.brandlogo.databinding.FragmentQuizBinding
  18. class QuizFragment : Fragment(){
  19. lateinit var binding: FragmentQuizBinding
  20. var quizzes: MutableList<quizmodel>? = null
  21. private var questions = mutableMapOf<String, Question>()
  22. private lateinit var mArraylist: ArrayList<Question>
  23. var index = 1
  24. private lateinit var mfirestore: FirebaseFirestore
  25. private lateinit var mrecycler: RecyclerView
  26. lateinit var myadapter: QuestionAdap
  27. override fun onCreate(savedInstanceState: Bundle?) {
  28. super.onCreate(savedInstanceState)
  29. }
  30. override fun onCreateView(
  31. inflater: LayoutInflater, container: ViewGroup?,
  32. savedInstanceState: Bundle?
  33. ): View? {
  34. binding = FragmentQuizBinding.inflate(layoutInflater)
  35. return binding.root
  36. }
  37. override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
  38. super.onViewCreated(view, savedInstanceState)
  39. mrecycler = binding.optionList
  40. mrecycler.layoutManager
  41. myadapter = QuestionAdap(requireContext(),Question())
  42. mArraylist = arrayListOf()
  43. questions.map { it.key to it.value }.shuffled().toMap()
  44. setUpFirestore()
  45. setUpEventListener()
  46. }
  47. override fun onDestroy() {
  48. super.onDestroy()
  49. mfirestore.terminate()
  50. // finish()
  51. }
  52. private fun setUpEventListener() {
  53. binding.nextbtn.setOnClickListener {
  54. index++
  55. bindViews()
  56. }
  57. // binding.btnSubmit.setOnClickListener {
  58. // Log.d("FINALQUIZ", questions.toString())
  59. // val intent = Intent(this, ResultActivity::class.java)
  60. // val json = Gson().toJson(quizzes!![0])
  61. // intent.putExtra("QUIZ", json)
  62. // startActivity(intent)
  63. // finish()
  64. // }
  65. }
  66. private fun setUpFirestore() {
  67. mfirestore = FirebaseFirestore.getInstance()
  68. val quizTitle = activity?.intent?.getStringExtra("title")
  69. if (quizTitle != null) {
  70. mfirestore.collection("Quizes").whereEqualTo("title", quizTitle)
  71. .get()
  72. .addOnSuccessListener {
  73. if (it != null && !it.isEmpty) {
  74. quizzes = it.toObjects(quizmodel::class.java)
  75. questions = quizzes!![0].questions
  76. shuffle()
  77. bindViews()
  78. }
  79. }
  80. }
  81. }
  82. private fun bindViews() {
  83. // btnPrevious.visibility = View.GONE
  84. // binding.btnSubmit.visibility = View.GONE
  85. // binding.btnNext.visibility = View.GONE
  86. // if (index == 1) { //first question
  87. // binding.btnNext.visibility = View.VISIBLE
  88. // } else if (index == questions!!.size) { // last question
  89. // binding.btnSubmit.visibility = View.VISIBLE
  90. //// btnPrevious.visibility = View.VISIBLE
  91. // } else { // Middle
  92. //// btnPrevious.visibility = View.VISIBLE
  93. // binding.btnNext.visibility = View.VISIBLE
  94. // }
  95. val circularProgressDrawable = CircularProgressDrawable(requireContext())
  96. circularProgressDrawable.strokeWidth = 8f
  97. // circularProgressDrawable.colorFilter = ("#ac5fe1")
  98. circularProgressDrawable.centerRadius = 30f
  99. circularProgressDrawable.start()
  100. val question = questions!!["question$index"]
  101. question?.let {
  102. Glide.with(this).load(it.imagequiz).placeholder(circularProgressDrawable).into(binding.imagequiz)
  103. val optionAdapter = QuestionAdap(requireContext(), it)
  104. mrecycler.layoutManager = LinearLayoutManager(requireContext())
  105. mrecycler.adapter = optionAdapter
  106. mrecycler.setHasFixedSize(true)
  107. }
  108. }
  109. private fun shuffle() {
  110. val keys = questions.keys.toMutableList().shuffled()
  111. val values = questions.values.toMutableList().shuffled()
  112. keys.forEachIndexed { index, key ->
  113. questions[key] = values[index]
  114. }
  115. }
  116. }

我尝试在适配器中调用片段,如下所示:QuizFragment().绑定.btnxt.可见性=查看.可见
在BindViewHolder函数中。
谢谢

ergxz8rk

ergxz8rk1#

你可以在你的片段中使用Kotlin的回调函数,它将被传递到你的适配器中,所以每当你从适配器调用回调函数时,它将在你的片段中被触发。
第一步:在你的代码片段中创建一个类似下面的方法。

  1. private fun showHideButtonFromAdapter (
  2. isButtonVisible: Boolean
  3. ) {
  4. // set your button visibility according to isButtonVisible value.
  5. }

步骤2:将方法作为参数从片段传递到适配器

  1. val adapter = YourAdapter(::showHideButtonFromAdapter)
  2. // set above adapter in your recycler view.

步骤3:在适配器中调用回调函数,如下所示。

  1. class ColorPickerAdapter constructor(
  2. private val onItemClicked: (Boolean) -> Unit
  3. ) : RecyclerView.Adapter<YourAdapter.ViewHolder>() {
  4. // your other adapter methods here
  5. override fun onBindViewHolder(holder: ViewHolder, position: Int) {
  6. onItemClicked.invoke(pass true or false as per your requirement)
  7. // above invocation will trigger an event in the fragment.
  8. }
  9. }
展开查看全部
w3nuxt5m

w3nuxt5m2#

在适配器中需要有片段的示例,因此请将其更改为:

  1. class QuestionAdap(val context: Context, val question: Question, fragment: Fragment) :
  2. RecyclerView.Adapter<QuestionAdap.OptionViewHolder>() {

然后,您只需在适配器中编写fragment即可调用片段,如下所示:

  1. override fun onBindViewHolder(holder: OptionViewHolder, position: Int) {
  2. holder.optionView.text = options[position]
  3. holder.itemView.setOnClickListener {
  4. question.userAnswer = options[position]
  5. notifyDataSetChanged()
  6. }
  7. //Example
  8. fragment.shuffle()

当你创建它的适配器时,你需要发送这个片段示例,所以在你的片段中使用:

  1. myadapter = QuestionAdap(requireContext(),Question(), this)
展开查看全部
lsmepo6l

lsmepo6l3#

你可以使用Kotlinlambda函数来实现它。

  1. class QuestionAdap(val context: Context, val question: Question, var onItemClicked: ((boolean) -> Unit))

在适配器中所需的位置和片段中调用onItemClicked

  1. myadapter = QuestionAdap(requireContext(),Question()) { boolean ->
  2. if (boolean) {
  3. //hide/show
  4. } else {
  5. //hide/show
  6. }
  7. }

相关问题