После того, как я заполняю свой Spinner из асинхронного вызова API, независимо от того, какой элемент я выберу из своего Spinner, я получаю первый - PullRequest
0 голосов
/ 29 мая 2019

Я делаю вызов, используя модификацию и RxJava для моего API из моего первого фрагмента, затем я отображаю полученный ответ в Spinner.Но всякий раз, когда я выбираю предмет из моего Spinner и нажимаю кнопку sendButton моего первого фрагмента, чтобы отправить его во второй фрагмент, я всегда получаю первый элемент моего Spinner.

Это код моего фрагмента

class SkillUpFragment : Fragment() {
    val TAG = SkillUpFragment::class.simpleName

    lateinit var skillsSpin : Spinner
    lateinit var model : SharedViewModel
    private val myCompositeDisposable= CompositeDisposable()

    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
        val view = inflater.inflate(R.layout.skill_up_fragment, container, false)

        skillsSpin = view!!.findViewById(R.id.skill_spinner)
        model = ViewModelProviders.of(activity!!).get(SharedViewModel::class.java)

        return view
    }

    override fun onStart() {
        super.onStart()
        loadData()
    }

    override fun onStop() {
        super.onStop()
        myCompositeDisposable.dispose()
    }

    private fun loadData(){
        val token = SharedPrefManager.getInstance(activity!!.applicationContext).loginResponse.token
        val parsedJWT = JWT(token!!)
        val metaId = parsedJWT.getClaim("id")
        val id = metaId.asInt()

        myCompositeDisposable.add(RetrofitClient.instance.getSkillsToChoose(Id(id!!))
            .observeOn(AndroidSchedulers.mainThread())
            .subscribeOn(Schedulers.io())
            .subscribe(this::handleResponse))

    }

    private fun handleResponse(skills: List<Skill>){
        val skillsName = skills.map { it.name }

        skillsSpin.adapter = ArrayAdapter<String>(context, android.R.layout.simple_list_item_1,skillsName)
        skillsSpin.onItemSelectedListener = object : AdapterView.OnItemSelectedListener {
            override fun onNothingSelected(parent: AdapterView<*>?) {
                TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
            }

            override fun onItemSelected(parent: AdapterView<*>?, view: View?, position: Int, id: Long) {
                val skill = skillsName[id.toInt()]
                //When i display the value of skill before the button listener i get the right value
                Log.i(TAG, skill)
                frag_button_choose.setOnClickListener {
                    //whenever i click on the button, no matter what item i select i only from the spinner, i get always the first !!!
                    Log.i(TAG, skill)
                    model.setText(skill)
                }
            }
        }
    }
}

Пожалуйста, это очень запутанно, я застрял больше недели, любая помощь приветствуется.Спасибо всем.

1 Ответ

1 голос
/ 02 июня 2019

Выберите позицию, а не ID внутри onItemSelected

 override fun onItemSelected(parent: AdapterView<*>?, view: View?, position: Int, id: Long) {
            val skill = skillsName[position]
            //When i display the value of skill before the button listener i get the right value
            Log.i(TAG, skill)
            frag_button_choose.setOnClickListener {
                //whenever i click on the button, no matter what item i select i only from the spinner, i get always the first !!!
                Log.i(TAG, skill)
                model.setText(skill)
            }
        }

Это все

...