У меня есть динамический 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
}
}