Если в представлении «Переработчик» установлен флажок для элемента, то после нажатия кнопки «Выбрать все» установка флажка для второго элемента вызывает ошибку. Я не знаю, как решить эту проблему?.
Говорят, что причина ошибки возникает во время сборки. -> 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
}
} } } }