RecyclerView添加了一个空的"布局项目,当我点击它时,应用程序崩溃

时间:2017-11-20 16:00:23

标签: android android-recyclerview crash kotlin

我没有向我的RecyclerView添加任何数据,但它显示了一个空框(我在数据的布局中设置的那个)无论如何。它崩溃了这个错误消息

java.lang.IndexOutOfBoundsException: Index: 0, Size: 0

这是我的customAdapter:

class CustomAdapterExercise(var exerciseList: ArrayList<Exercise>, val addList: ArrayList<textAdd>) : RecyclerView.Adapter<CustomAdapterExercise.ViewHolder>() {

val typeAdd = 0
val typeExercise = 1

override fun getItemViewType(position: Int): Int {
    if (position == exerciseList.size + 1) {
        return typeAdd
    }
    else{
        return typeExercise
    }

}

//this method is returning the view for each item in the list
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): CustomAdapterExercise.ViewHolder {

    if (viewType == typeExercise) {
        val itemView = LayoutInflater.from(parent.context).inflate(R.layout.exercise_layout, parent, false)
        return ViewHolder(itemView)

    } else {
        val itemView = LayoutInflater.from(parent.context).inflate(R.layout.add_layout, parent, false)
        return ViewHolder(itemView)
    }

}

//this method is binding the data on the list
override fun onBindViewHolder(holder: CustomAdapterExercise.ViewHolder, position: Int) {
    if (holder.itemViewType == typeAdd) {
        holder.bindAdd(addList[0])
    }
    else{
        if(position != exerciseList.size){
            holder.bindItems(exerciseList[position])
        }
    }
}

//this method is giving the size of the list
override fun getItemCount(): Int {
    return exerciseList.size + 2
}

//the class is hodling the list view
class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {

    fun bindItems(Exercise: Exercise) { 

        var exerciseAmount = itemView.findViewById<TextView>(R.id.exerciseAmount)

        if(exerciseAmount != null){
            exerciseAmount.text = Exercise.exAmount

        }
    }

    fun bindAdd(textAdd: textAdd){
        val addText = itemView.findViewById<TextView>(R.id.addText)
        if(addText != null){
            addText.text = textAdd.textAdd
        }

    }
}
}

即使我添加了一些数据,它仍然会在那里产生一个空盒子,我不明白为什么。 我想知道怎样才能阻止它永远制作一个空盒子?

1 个答案:

答案 0 :(得分:1)

这些是在RecyclerView中计算索引的问题:

在getItemCount中它应该是+ 1,而不是+ 2,因为它只需要添加一个额外的项目来添加按钮。

在列表末尾的getItemViewType位置,如果列表长度,而不是列表长度+1。这是因为位置是0索引的。因此,例如,如果您有5个项目,则位置0-4将是您的锻炼项目,然后位置5(位置== exerciseList.size)将是一个添加项目。

在getItemViewType中为位置和生成的视图类型添加日志有助于调试,因为它显示了哪些位置的计算速度非常快。