Привет) Я новичок в 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