как решить java .lang.IndexOutOfBoundsException: индекс: 2, размер: 0? - PullRequest
0 голосов
/ 24 марта 2020

Если в представлении «Переработчик» установлен флажок для элемента, то после нажатия кнопки «Выбрать все» установка флажка для второго элемента вызывает ошибку. Я не знаю, как решить эту проблему?.

Говорят, что причина ошибки возникает во время сборки. -> data !! [position] .selected = проверено, listener.onCheckboxChanged (position, isChecked)

Позволяет проверить мой код.


interface CartItemListener {
    fun onCheckboxChanged(index: Int, checked: Boolean)
}


class CartViewActivity : AppCompatActivity(), SwipeRefreshLayout.OnRefreshListener, CartItemListener {
   lateinit var mAdapter: CartItemRecyclerAdapter
    lateinit var layoutManager: LinearLayoutManager
    private var data: ArrayList<ViewCartdocs>? = null
    var list: ArrayList<ViewCartdocs> = ArrayList()
    var visibleItemCount: Int = 0
    var totalItemCount:Int = 0
    var pastVisibleItemCount : Int = 0
    var pageMax: Int = 20
    var page = 0
    var loading :Boolean = false

    @SuppressLint("SetTextI18n")
    private fun showTotalPrice() {
        val selected = data!!.filter{
            it.selected
        }

        val total = selected.fold(0) {
                acc, doc ->
            acc + doc.cartdocs.totalPrice!!
        }

        if (selected.isNotEmpty()) {
            layoutOrder.visibility = View.VISIBLE
            val dec = DecimalFormat("##,000")
        } else {
            layoutOrder.visibility = View.GONE
        }
    }

    private fun showCount() {
        val selected = data!!.filter {
            it.selected
        }

        val count = selected.fold(0) {
            acc, doc ->
            acc + doc.cartdocs.amount!!
        }

        if (selected.isNotEmpty()) {
            layoutOrder.visibility = View.VISIBLE
        } else {
            layoutOrder.visibility = View.GONE
        }

    }

    @RequiresApi(Build.VERSION_CODES.N)
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_cart_view)


        val token=SharedPreference.getTokenInfo(this)

        layoutManager = LinearLayoutManager(this)
        recycler_view.layoutManager = layoutManager

        getCartItems(page)

        btn_appbar_back.setOnClickListener {
           finish()
            overridePendingTransition(R.anim.enter, R.anim.exit)
            /*val nextIntent = Intent(this, MainActivity::class.java)
            startActivity(nextIntent)*/
        }

        btn_appbar_home.setOnClickListener {
            val nextIntent = Intent(this, MainActivity::class.java)
            startActivity(nextIntent)
            overridePendingTransition(R.anim.enter, R.anim.exit)
        }

        selectAll.setOnCheckedChangeListener { _, isChecked ->

            if (isChecked) {

                for (cartDocs in mAdapter.cartItems) {
                    var state = true
                    cartDocs.selected = state

                }
                mAdapter.notifyDataSetChanged()
                selectAll.background = getDrawable(R.drawable.check_box_active_cs)
            } else {
                for (cartDocs in mAdapter.cartItems) {
                    var state = false
                    cartDocs.selected = state
                }
                mAdapter.notifyDataSetChanged()
                selectAll.background = getDrawable(R.drawable.check_box_no)
            }
            showTotalPrice()
            showCount()
        }


    private fun getCartItems(page: Int) {

        val token = SharedPreference.getTokenInfo(this)
        Client.retrofitService.getCart(token, page, pageMax).enqueue(object : Callback<CartResponse> {
            override fun onResponse(call: Call<CartResponse>, response: Response<CartResponse>) {
                if (response.isSuccessful) {
                    swipeRefreshLo.setOnRefreshListener(this@CartViewActivity)
                    loading = true
                    showData(makeModel(response.body()!!.docs))

                 } else {
                 val er = Gson().fromJson(response.errorBody()?.charStream(), ErrorResponse::class.java)
                 if (er.code == 60202) {

                 }
             }
         }

         override fun onFailure(call: Call<CartResponse>, t: Throwable) {

         }

     })

 }

    private fun makeModel(data: ArrayList<Cartdocs>): ArrayList<ViewCartdocs> {
     return data.map {
         ViewCartdocs(
             it,
             false
         )
     }.toCollection(ArrayList())
 }

    override fun onCheckboxChanged(position: Int, checked: Boolean) {

     if (null == data) {
         return
     }

     data!![position].selected = checked


        showTotalPrice()

     showCount()

     val isAllSelected = data!!.fold(true) {
             acc, doc ->
         acc && doc.selected
     }
     if (isAllSelected) {
         selectAll.background=getDrawable(R.drawable.check_box_active_cs)
     } else {
         selectAll.background=getDrawable(R.drawable.check_box_no)
     }


 }



 }


     private fun showData(results: ArrayList<ViewCartdocs>) {

     val cartView = this
     data = results
     recycler_view.apply  {

if (list.size==0) {
    list = results as ArrayList<ViewCartdocs>
    mAdapter = CartItemRecyclerAdapter(context, list, cartView)
    recycler_view.adapter = mAdapter
}else {
    var currentPosition =(recycler_view.layoutManager as LinearLayoutManager).findLastVisibleItemPosition()
    list.addAll(results)
    mAdapter.notifyDataSetChanged()
    recycler_view.scrollToPosition(currentPosition)
}


recycler_view.addOnScrollListener(object : RecyclerView.OnScrollListener() {
    override fun onScrolled(recyclerView: RecyclerView, dx: Int, dy: Int) {

        if (dy > 0) {
            visibleItemCount = layoutManager!!.childCount
            totalItemCount = layoutManager!!.itemCount
            pastVisibleItemCount =
                (recyclerView.layoutManager as LinearLayoutManager).findFirstCompletelyVisibleItemPosition()
            if (loading) {
                if ((visibleItemCount + pastVisibleItemCount) >= totalItemCount) {
                    loading = false
                    page++
                    getCartItems(page)
                }
            }
        }}

    override fun onScrollStateChanged(recyclerView: RecyclerView, newState: Int) {
        super.onScrollStateChanged(recyclerView, newState)
    }
})
}}

    override fun onRefresh() {
         swipeRefreshLo.isRefreshing = false
}

    data class ViewCartdocs(var cartdocs: Cartdocs, var selected: Boolean)

    class CartItemRecyclerAdapter(var context: Context, var cartItems: ArrayList<ViewCartdocs>, var listener: CartItemListener) : RecyclerView.Adapter<CartItemRecyclerAdapter.Holder>() {





override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): Holder {

var view = LayoutInflater.from(context).inflate(R.layout.cart_item_list, parent, false)
return Holder(view)


}

override fun onBindViewHolder(holder: Holder, position: Int) {


holder.bind(cartItems[position].cartdocs, context)
holder.checkbox.setOnCheckedChangeListener(null)
    holder.checkbox.isChecked = cartItems[position].selected
holder.checkbox.setOnCheckedChangeListener { buttonView, isChecked ->
  if (isChecked) {
      holder.checkbox.background = holder.checkbox.context.getDrawable(R.drawable.check_box_active_cs)
  } else {
     holder.checkbox.background = holder.checkbox.context.getDrawable(R.drawable.check_box_no)
  }
    listener.onCheckboxChanged(position, isChecked)
}

}

override fun getItemCount(): Int = cartItems.size


inner class Holder(itemView: View) : RecyclerView.ViewHolder(itemView) {

var imageView = itemView.findViewById(R.id.imageView) as ImageView
var checkbox = itemView.findViewById(R.id.checkBox) as CheckBox
var option = itemView.findViewById(R.id.optionText) as TextView
var deleteBox = itemView.findViewById(R.id.delete) as Button
var orderBtn = itemView.findViewById(R.id.btnOrder) as Button
val token = SharedPreference.getTokenInfo(context)



@SuppressLint("SetTextI18n")
fun bind(data: Cartdocs, context: Context) {
val dec = DecimalFormat("##,000")
itemView.titleText.text = data.title
itemView.priceText.text = dec.format(data.totalPrice).toString()
itemView.textViewItemNumer.text = data.amount.toString() 
itemView.pointValueText.text = dec.format(data.totalPoint).toString() + "P"
  Glide.with(context).load(data.mainImage).into(imageView)

  var descriptions = ""

  for ((index, option) in data.options.withIndex()) {
      descriptions += option.description

      if (index != (data.options.size - 1)) {
          descriptions += ", "
      }
  }

  itemView.optionText.text= descriptions


  if (descriptions==""){
      option.visibility=View.GONE
  }



} } } }


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