Многократный тип списка в переработке - PullRequest
0 голосов
/ 13 февраля 2020

У меня есть динамический c список вопросов из API с обзором реселлера, но каждый вопрос имеет свой тип (Входной текст, Радиокнопка и т. Д. c), поэтому мне нужно составить список с другим типом в моем обзоре реселлера. я нахожусь на inte rnet также на этом сайте мне нужно проверить тип списка в onCreateViewHolder и вернуть представление с другим источником макета, но я все еще не могу решить мою проблему, мой результат не возвращает никакой ошибки, но мой список всегда возвращает только представление первого типа (макет input_field), но не может вернуть представление второго типа (макет input_selection)

это мой адаптер

class QuestionViewAdapter(private val listQuestion: ArrayList<Question>) : RecyclerView.Adapter<QuestionViewAdapter.InputField>() {
    private var context: Context? = null
    override fun onCreateViewHolder(viewGroup: ViewGroup, i: Int): InputField {
        context = viewGroup.context
        if(listQuestion[i].prodeskel_type_id == 1){
            var view = LayoutInflater.from(viewGroup.context).inflate(R.layout.input_field, viewGroup, false)
            return InputField(view)
        } else {
            var view = LayoutInflater.from(viewGroup.context).inflate(R.layout.input_selection, viewGroup, false)
            return InputField(view)
        }
    }

    override fun onBindViewHolder(InputFieldHolder: InputField, i: Int) {
        val question = listQuestion.get(i)

        if(question.prodeskel_type_id == 2){
            InputFieldHolder.questionText?.text = question.isi
            var rprms = InputFieldHolder.radiogroup?.layoutParams
            for (i in question.pilihan_jawabans) {
                val rdbtn = RadioButton(context)
                rdbtn.id = View.generateViewId()
                rdbtn.text = i.isi.toString()
                rprms = RadioGroup.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT)
                InputFieldHolder.radiogroup?.addView(rdbtn, rprms)

            }
        } else {
            InputFieldHolder.txtInput?.hint = question.isi
            if(question.getEditTextValue().toString() != "null"){
                InputFieldHolder.txtInput?.editText?.setText(question.getEditTextValue().toString())
            }


            InputFieldHolder.txtInput?.editText?.addTextChangedListener(object : TextWatcher {

                override fun afterTextChanged(s: Editable) {
                    InputFieldHolder.txtInput?.editText?.text?.length?.let {
                        InputFieldHolder.txtInput?.editText?.setSelection(
                            it
                        )
                    }
                }

                override fun beforeTextChanged(s: CharSequence, start: Int,
                                               count: Int, after: Int) {

                }

                override fun onTextChanged(s: CharSequence, start: Int,
                                           before: Int, count: Int) {
                    Log.i("Edit", InputFieldHolder.txtInput?.editText?.text.toString())
                    question.setEditTextValue(InputFieldHolder.txtInput?.editText?.text.toString())
                }
            })
        }
        InputFieldHolder.setIsRecyclable(false);
    }

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

    public fun getItem(): ArrayList<Question> {
        return listQuestion
    }

    inner class InputField internal constructor(itemView: View) : RecyclerView.ViewHolder(itemView) {
        internal var txtInput: TextInputLayout? = null
        internal var radiogroup: RadioGroup? = null
        internal var questionText: TextView? = null

        init {
            txtInput = itemView.findViewById(R.id.txtInputField)
            radiogroup = itemView.findViewById(R.id.radiogroup)
            questionText = itemView.findViewById(R.id.questionText)
        }
     }
}

ОБНОВЛЕНИЕ (решено)

я решил добавив эту функцию

override fun getItemViewType(position: Int) = listQuestion[position].prodeskel_type_id

и добавив условие выбора в onCreateViewHolder и onBindViewHolder

override fun onCreateViewHolder(viewGroup: ViewGroup, viewType: Int): InputField {

    if(viewType == 1){
        //view type layout1
    } else {
        //view type layout2

    }
}


override fun onBindViewHolder(InputFieldHolder: InputField, i: Int) {

    if(getItemViewType(i) == 1){
        //add text to layout1

    } else {
        //add text to layout2
    }

}

Ответы [ 2 ]

1 голос
/ 13 февраля 2020

Как вы написали в коде, onCreateViewHolder получает Int, и это тип представления. основываясь на том, что он создает viewholders.

Но в вашем случае тип представления будет всегда 0. onCreateViewHolder получает viewType и возвращается getItemViewType, который вам нужно переопределить.

например

    @Override
    public int getItemViewType(int position) {
        // Just as an example, return 0 or 2 depending on position
        // Note that unlike in ListView adapters, types don't have to be contiguous
        return viewType;
    }

также ваши onCreateViewHolder и onBindViewHolder должны зависеть от viewType, полученного в качестве аргумента.

пример

override fun onCreateViewHolder(viewGroup: ViewGroup, viewType: Int): InputField {       
 if(viewType == 1){  
  ... 
 }
}

override fun onBindViewHolder(InputFieldHolder: InputField, position: Int) {
  if(getViewType(position) == 1){ 
     ... 
  }
}

В вашем Сценарий getViewType будет примерно таким

override fun getItemViewType(position: Int) = listQuestion[position].prodeskel_type_id

Надеюсь, это поможет. также я бы попросил вас понять, как работает RecyclerView и его адаптер

1 голос
/ 13 февраля 2020

Чтобы использовать несколько типов элементов в RecyclerView, вам необходимо переопределить метод getItemViewType. Возвращаемое значение будет помещено в качестве второго параметра в методе onCreateViewHolder (кстати, лучше переименовать его с i на viewType). Реализация по умолчанию getItemViewType всегда возвращает одно и то же значение, поэтому вы никогда не получите то, что хотите, с ним.

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