Приложение для испытаний с recyclerView и фрагментами - PullRequest
1 голос
/ 24 марта 2020

Привет) Я новичок в Android dev. Я должен создать приложение для прохождения тестов. Тест, который я беру из JSON, вот так. Есть 3 типа вопросов: вход, signleChoise и multiChoise. Я беру 10 случайных вопросов и помещаю их в RecyclerView. Когда я нажимаю кнопку прокрутки RecyclerView и когда она переходит к последнему пункту, тестирование завершается.

Это мой класс:

@Parcelize
class Test      (var id: Int,
                 var numberQuestion: String,
                 var question: String,
                 var questionImageSrc: String,
                 var examination: Boolean,
                 var typeQuestion: String,
                 var singleChoiceAnswers: ArrayList<singleChoiceAnswer>,
                 var multipleChoiceAnswers: ArrayList<multipleChoiceAnswers>,
                 var inputAnswer: ArrayList<inputAnswer>): Parcelable{

}

@Parcelize
class multipleChoiceAnswers(var letter: String,
                                 var text: String,
                                 var correctAnswer: Boolean,
                                 var checked: Boolean):Parcelable

@Parcelize
data class singleChoiceAnswer(var letter: String,
                              var text: String,
                              var correctAnswer: Boolean,
                              var checked: Boolean):Parcelable

@Parcelize
data class inputAnswer(var correctAnswer: String,
                        var userAnswer: String):Parcelable

И здесь у меня проблема. Это моя деятельность:

class TestActivity : AppCompatActivity() {

    private lateinit var urlToTest: String
    private val list = ArrayList<Test>()
    private var randomList = ArrayList<Test>()
    private var currentItem = 0

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_test)

        val title = getIntent().getStringExtra("TestTitle")
        setTitle(title)

        urlToTest = "http://sasmobile.ru" + getIntent().getStringExtra("urlToJson") + getIntent().getStringExtra("jsonName")


        val recView = findViewById<RecyclerView>(R.id.testRecyclerView)
        recView.layoutManager = LinearLayoutManager(this, RecyclerView.HORIZONTAL, false)

        val connector = Connector().isConnectedToNetwork(this)

        if (connector) {
            AsyncTaskHandler().execute(urlToTest)


            val submitButton : Button = findViewById<Button>(R.id.submitButton)
            submitButton.setOnClickListener{
                if (currentItem<9) {
                    testAdapterItemClick(randomList[currentItem + 1], currentItem)
                    currentItem += 1
                }
                if(currentItem==9){
                    submitButton.text="Finish Test"

                }
            }
        }
        else{
            submitButton.visibility=View.INVISIBLE
            openAlertDialog()
        }


    }


    private fun openAlertDialog(){
        val dialogBuilder = AlertDialog.Builder(this)
        val connector = Connector().isConnectedToNetwork(this)

        dialogBuilder.setMessage("Check your Internet connection")
            .setCancelable(false)

            .setPositiveButton("Try again", DialogInterface.OnClickListener{
                    dialog, id -> if (connector) {
                dialog.cancel()
                AsyncTaskHandler().execute(urlToTest)
            }
            else openAlertDialog()
            })


        val alertBox = dialogBuilder.create()
        alertBox.setTitle("Ooops")
        alertBox.show()
    }




    private fun testAdapterItemClick(item: Test, currI : Int) {

        val fT: FragmentTransaction = supportFragmentManager.beginTransaction()

        currentItem = currI

        val frag1 = Fragment1()
        val frag2 = Fragment2()
        val frag3 = Fragment3()
        val frag4 : Fragment
        val frag5 : Fragment
        val frag6 : Fragment
        val frag7 : Fragment
        val frag8 : Fragment
        val frag9 : Fragment
        val frag10 : Fragment

        val fragmentsList : ArrayList<Fragment>

        if (item.typeQuestion == "input") {
            val bundle = Bundle()
            bundle.putParcelable("ITEM", item)

            if(!item.questionImageSrc.isNullOrEmpty())
                bundle.putString("IMAGE_KEY", item.questionImageSrc)

            frag1.setArguments(bundle)
            fT.add(R.id.frameLayout, frag1)
        }


        if (item.typeQuestion == "singleChoice") {
            val bundle = Bundle()
            bundle.putParcelable("ITEM", item)

            val count = item.singleChoiceAnswers.count()
            bundle.putInt("COUNT_KEY", count)

            frag2.setArguments(bundle)

            fT.add(R.id.frameLayout, frag2)
        }

        if (item.typeQuestion == "multipleChoice") {
            val bundle = Bundle()
            bundle.putString("NUMBER_KEY", item.numberQuestion)
            bundle.putString("QUESTION_KEY", item.question)

            val count = item.multipleChoiceAnswers.count()
            bundle.putInt("COUNT_KEY", count)


            for (i in 0 until count)
            {
                val curentSCA = item.multipleChoiceAnswers[i]

                bundle.putString("letterSCA$i", curentSCA.letter)
                bundle.putString("textSCA$i", curentSCA.text)

            }
            if(!item.questionImageSrc.isNullOrEmpty())
                bundle.putString("IMAGE_KEY", item.questionImageSrc)

            frag3.setArguments(bundle)

            fT.add(R.id.frameLayout, frag3)
        }

        fT.addToBackStack(null)
        fT.commit()

    }




    fun checkTest(exam: Boolean): Boolean{
       return exam
    }




    inner class AsyncTaskHandler() : AsyncTask<String, String, String>() {

        override fun onPreExecute() {
            val proggressBar: ProgressBar = findViewById(R.id.progressBarTest)
            proggressBar.visibility = View.VISIBLE
            super.onPreExecute()
        }


        override fun doInBackground(vararg params: String?): String {
            val res: String
            val connection = URL(urlToTest).openConnection() as HttpURLConnection

            try {
                connection.connect()
                res = connection.inputStream.use { it.reader().use { reader -> reader.readText() } }
            } finally {
                connection.disconnect()
            }
            return res
        }


        override fun onPostExecute(result: String?) {
            super.onPostExecute(result)
            if (progressBarTest.visibility == View.VISIBLE)
                progressBarTest.visibility = View.INVISIBLE
            jsonResult(result)
        }


        private fun jsonResult(jsonString: String?) {

            val jsonArray = JSONArray(jsonString)

            for (i in 0 until jsonArray.length()){
                val jsonObject = jsonArray.getJSONObject(i)
                val typeQuestion = jsonObject.getString("typeQuestion")

                val curentId = jsonObject.optInt("id")
                val curentNQ = jsonObject.optString("numberQuestion")
                val curentQ = jsonObject.optString("question")
                val curentQIS = jsonObject.optString("questionImageSrc")
                val curentEx = jsonObject.optBoolean("examination")


                if (typeQuestion.contains("multipleChoice")){
                    val multipleChoiceAnswers = jsonObject.getJSONArray("multipleChoiceAnswers")
                    val mlist = ArrayList<multipleChoiceAnswers>()
                    val ilist = ArrayList<inputAnswer>()
                    val slist = ArrayList<singleChoiceAnswer>()


                    for (sc in 0 until multipleChoiceAnswers.length()){
                        val curentMCA = multipleChoiceAnswers.getJSONObject(sc)
                        val letter = curentMCA.optString("letter")
                        val text = curentMCA.optString("text")
                        val correctAnswer = curentMCA.optBoolean("correctAnswer")
                        val checked = curentMCA.optBoolean("checked")

                        mlist.add(multipleChoiceAnswers(letter, text, correctAnswer, checked))
                    }
                    list.add(Test(curentId, curentNQ, curentQ, curentQIS, curentEx, typeQuestion, slist, mlist, ilist))

                }
                if (typeQuestion.contains("singleChoice")){
                    val mlist = ArrayList<multipleChoiceAnswers>()
                    val ilist = ArrayList<inputAnswer>()
                    val slist = ArrayList<singleChoiceAnswer>()
                    val singleChoiceAnswer = jsonObject.getJSONArray("singleChoiceAnswers")

                    for (sc in 0 until singleChoiceAnswer.length()){
                        val curentSCA = singleChoiceAnswer.getJSONObject(sc)
                        val letter = curentSCA.optString("letter")
                        val text = curentSCA.optString("text")
                        val correctAnswer = curentSCA.optBoolean("correctAnswer")
                        val checked = curentSCA.optBoolean("checked")

                        slist.add(singleChoiceAnswer(letter, text, correctAnswer, checked))
                    }

                    list.add(Test(curentId, curentNQ, curentQ, curentQIS, curentEx, typeQuestion, slist, mlist, ilist))

                }
                if (typeQuestion.contains("input")){
                    val inputAnswer = jsonObject.getJSONArray("inputAnswer")
                    val mlist = ArrayList<multipleChoiceAnswers>()
                    val ilist = ArrayList<inputAnswer>()
                    val slist = ArrayList<singleChoiceAnswer>()

                    for (sc in 0 until inputAnswer.length()){
                        val curentIA = inputAnswer.getJSONObject(sc)
                        val correctAnswer = curentIA.optString("correctAnswer")
                        val userAnswer = curentIA.optString("userAnswer")

                        ilist.add(inputAnswer(correctAnswer,userAnswer))
                    }
                    list.add(Test(curentId, curentNQ, curentQ, curentQIS, curentEx, typeQuestion, slist, mlist, ilist))
                }


            }

            randomList = SubmitTest().getRandomList(list)


            val adapter = TestAdapter(randomList) { item, position ->
                testAdapterItemClick(item, position)
            }

            testAdapterItemClick(randomList[currentItem], currentItem)

            val recView = findViewById<RecyclerView>(R.id.testRecyclerView)

            recView.adapter = adapter

        }

    }

}

В AsyncTask я беру данные из json и вставляю адаптер. Пожалуйста, помогите мне с фрагментами. Я не понимаю, что я должен делать для сохранения состояния всего элемента, если я хочу выбрать его. А где лучше проверить тесты?

Вот мой адаптер:

class TestAdapter(val test : ArrayList<Test>, private val testAdapterCallback: (Test, Int)-> Unit) : RecyclerView.Adapter<TestAdapter.ViewHolder>(){

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {

        val v = LayoutInflater.from(parent.context).inflate(R.layout.test_view_item, parent, false)


        return ViewHolder(v)
    }

    override fun getItemCount(): Int {
        return test.size
    }

    override fun onBindViewHolder(holder: ViewHolder, position: Int) {
        val num : Test = test[position]
        holder.textView.text = num.id.toString()

        holder.cardView.setOnClickListener(){
            testAdapterCallback(num, position)
        }
    }

    inner class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView){

        val cardView = itemView.findViewById<CardView>(R.id.testCardView)
        val textView = itemView.findViewById<TextView>(R.id.testTextView)

    }

}

А вот код для первого фрагмента:

class Fragment1 : Fragment(){

    public override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)


    }

    public override fun onCreateView(
        inflater: LayoutInflater,
        container: ViewGroup?,
        savedInstanceState: Bundle?): View? {

        val qI: String?

        val rootView = inflater.inflate(R.layout.fragment1, container, false)
        val item = getArguments()?.getParcelable("ITEM") as Test?

        val questionNumber = rootView.findViewById(R.id.questionNumber) as TextView
        val questionText = rootView.findViewById(R.id.Question) as TextView
        val questionImage = rootView.findViewById(R.id.questionImage) as ImageView

        if (!item?.questionImageSrc.isNullOrEmpty()) {
            qI = item?.questionImageSrc
            Picasso.get().load(qI).into(questionImage)

            questionImage.setOnClickListener(){
                val context : Context = this.getContext()!!
                val intent = Intent(context, OpenImageActivity::class.java)
                intent.putExtra("imageResource", qI)
                startActivity(intent)
            }
        }

        questionNumber.text=item?.numberQuestion
        questionText.text=item?.question


        val editText : EditText = rootView.findViewById(R.id.userAnswer)
        if (editText.text.toString()!="") {
            val userAnswer: String = editText.text.toString()
            if (userAnswer.toLowerCase(Locale.getDefault())==item!!.inputAnswer[0].correctAnswer.toLowerCase(Locale.getDefault())){
                item?.examination=true
            }
            else {
                item?.examination = false
            }

        }

        return rootView

    }

}

и для второй фрагмент:

class Fragment2 : Fragment() {

    public override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

    }

    public override fun onCreateView(
        inflater: LayoutInflater,
        container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {

        val rootView = inflater.inflate(R.layout.fragment2, container, false)
        val item = getArguments()?.getParcelable("ITEM") as Test?
        val qI: String?

        val questionNumber = rootView.findViewById(R.id.questionNumber) as TextView
        val questionText = rootView.findViewById(R.id.Question) as TextView
        val questionImage = rootView.findViewById(R.id.questionImage) as ImageView

        questionNumber.text = item?.numberQuestion
        questionText.text = item?.question


        if (!item?.questionImageSrc.isNullOrEmpty()) {
            qI = item?.questionImageSrc
            Picasso.get().load(qI).into(questionImage)

            questionImage.setOnClickListener() {
                val context: Context = this.getContext()!!
                val intent = Intent(context, OpenImageActivity::class.java)
                intent.putExtra("imageResource", qI)
                startActivity(intent)
            }
        }

            val radioGroup = rootView.findViewById(R.id.radioGroupSetectTest) as RadioGroup

            val count = getArguments()!!.getInt("COUNT_KEY")

            val context = getContext()

            for (i in 0 until count) {
                val curentRB = RadioButton(context)
                val curLetter = item!!.singleChoiceAnswers[i].letter
                val curText = item.singleChoiceAnswers[i].text

                curentRB.setId(i)
                curentRB.setText(curLetter + " " + curText)
                curentRB.setPadding(0, 30, 0, 30)
                radioGroup.addView(curentRB)

            }

        radioGroup.setOnCheckedChangeListener(
            RadioGroup.OnCheckedChangeListener{ radioGroup, i ->
                item!!.singleChoiceAnswers[i].checked=true

                if (item!!.singleChoiceAnswers[i].checked==item!!.singleChoiceAnswers[i].correctAnswer)
                {
                    item!!.examination=true
                }
                if (item!!.singleChoiceAnswers[i].checked!=item!!.singleChoiceAnswers[i].correctAnswer)
                {
                    item!!.examination=false
                }

            }
        )



        return rootView
    }

}

Третий фрагмент я еще не сделал) И как я должен вернуть Предмет из фрагмента в действие?

Заранее спасибо)

PS Извините за мой Engli sh

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...