Получение ArrayIndexOutOfBoundsException в классе адаптера - PullRequest
0 голосов
/ 10 января 2019

Когда я нажимаю элемент, я получаю

java.lang.ArrayIndexOutOfBoundsException: length = 10; индекс = -1

Это мой onCreateViewHolder метод, когда я щелкаю элемент, я хочу открыть DetailActivity и отправлять данные с намерением

override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
    val view = LayoutInflater.from(parent.context).inflate(R.layout.alphabet_item, parent, false)
    val holder = ViewHolder(view)
    view.setOnClickListener {
        val intent = Intent(parent.context, ItemAlphabetDetailActivity::class.java)
        intent.putExtra("NAME", alphabets[holder.position].context)/*
        intent.putExtra("CONTEXT", alphabets[holder.adapterPosition].context)
        intent.putExtra("IMAGE", alphabets[holder.adapterPosition].image)
        intent.putExtra("SOUND", alphabets[holder.adapterPosition].sound)*/
        parent.context.startActivity(intent)
    }
    return ViewHolder(view)
}

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

class ItemAlphabetAdapter(
private val alphabets: ArrayList<ItemAlphabet>
) : RecyclerView.Adapter<ItemAlphabetAdapter.ViewHolder>() {


override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
    val view = LayoutInflater.from(parent.context).inflate(R.layout.alphabet_item, parent, false)
    val holder = ViewHolder(view)
    view.setOnClickListener {
        val intent = Intent(parent.context, ItemAlphabetDetailActivity::class.java)
        intent.putExtra("NAME", alphabets[holder.position].context)/*
        intent.putExtra("CONTEXT", alphabets[holder.adapterPosition].context)
        intent.putExtra("IMAGE", alphabets[holder.adapterPosition].image)
        intent.putExtra("SOUND", alphabets[holder.adapterPosition].sound)*/
        parent.context.startActivity(intent)
    }
    return ViewHolder(view)
}

override fun getItemCount(): Int = alphabets.size


override fun onBindViewHolder(holder: ItemAlphabetAdapter.ViewHolder, position: Int) {

    val alphabet = alphabets[position]
    holder.name.text = alphabet.name
    holder.image.visibility = alphabet.image
}

class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
    val image: ImageView = itemView.findViewById(R.id.alphabet_image)
    val name: TextView = itemView.findViewById(R.id.alphabet_name)

}

}

Ответы [ 3 ]

0 голосов
/ 10 января 2019

Метод onCreateViewHolder вызывается не каждый раз, когда представлению реселлера необходимо отобразить строку, а только тогда, когда необходимо создать новое представление и на экране недостаточно представлений. Вместо этого метод onBindViewHolder вызывается для каждой позиции. Таким образом, чтобы получить точное положение строки, используйте holder.adapterPosition.

0 голосов
/ 10 января 2019

Попробуйте это. Переместите свой setOnClickListener в onBindViewHolder

itemView.setOnClickListener { если (позиция = - 1) {

    val intentIntent(itemView.context,ItemAlphabetDetailActivity::class.java)
    intent.putExtra("NAME", alphabets[position].context)/*
    intent.putExtra("CONTEXT", alphabets[position].context)
    intent.putExtra("IMAGE", alphabets[position].image)
    intent.putExtra("SOUND", alphabets[position].sound)*/
    parent.context.startActivity(intent)
}}
0 голосов
/ 10 января 2019

Вам нужно будет написать следующий код

val intent = Intent(parent.context, ItemAlphabetDetailActivity::class.java)
        intent.putExtra("NAME", alphabets[holder.position].context)/*
        intent.putExtra("CONTEXT", alphabets[holder.adapterPosition].context)
        intent.putExtra("IMAGE", alphabets[holder.adapterPosition].image)
        intent.putExtra("SOUND", alphabets[holder.adapterPosition].sound)*/
        parent.context.startActivity(intent)

в onBindViewHolder (), который уже дает вам позицию в качестве одного из параметров

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