Получавам наистина странен проблем, който не мога да разбера.
Просто се опитвам да осъществя достъп до елемент от списък с прост инструмент за получаване, но продължавам да получавам изключение ClassCastException: String cannot be cast to Number. В реда за грешка обаче няма включени низове, а само Int, който има достъп до списък с Ints. Изключение се повдига на последния ред (разделих ги, за да го проследя):
val cardKey1 = cards
val cardKey2 = cardKey1.keys
val cardKey3 = cardKey2.sorted()
val cardKey = cardKey3[1]
Доколкото проверих, cardKey3 е списък със стойност [0,1] при условията, които тествах, а cardKey1 и cardKey2 са MutableMap и MutableSet, ако това помага. Не се появяват грешки при компилирането, само когато отворя дейността, която извиква класа.
Пълната грешка е следната:
2021-02-28 22:29:59.629 12505-12505/rafaellobo.example.smartsave00 E/AndroidRuntime: FATAL EXCEPTION: main
Process: rafaellobo.example.smartsave00, PID: 12505
java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Number
at rafaellobo.example.smartsave00.CardsAdapter.getView(CardsAdapter.kt:62)
at android.widget.AbsListView.obtainView(AbsListView.java:2412)
at android.widget.ListView.measureHeightOfChildren(ListView.java:1421)
at android.widget.ListView.onMeasure(ListView.java:1327)
at android.view.View.measure(View.java:24601)
at androidx.constraintlayout.widget.ConstraintLayout$Measurer.measure(ConstraintLayout.java:792)
at androidx.constraintlayout.solver.widgets.analyzer.BasicMeasure.measure(BasicMeasure.java:480)
at androidx.constraintlayout.solver.widgets.analyzer.BasicMeasure.measureChildren(BasicMeasure.java:134)
at androidx.constraintlayout.solver.widgets.analyzer.BasicMeasure.solverMeasure(BasicMeasure.java:277)
at androidx.constraintlayout.solver.widgets.ConstraintWidgetContainer.measure(ConstraintWidgetContainer.java:119)
at androidx.constraintlayout.widget.ConstraintLayout.resolveSystem(ConstraintLayout.java:1578)
at androidx.constraintlayout.widget.ConstraintLayout.onMeasure(ConstraintLayout.java:1690)
at android.view.View.measure(View.java:24601)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6831)
at android.widget.FrameLayout.onMeasure(FrameLayout.java:194)
at androidx.appcompat.widget.ContentFrameLayout.onMeasure(ContentFrameLayout.java:146)
at android.view.View.measure(View.java:24601)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6831)
at androidx.appcompat.widget.ActionBarOverlayLayout.onMeasure(ActionBarOverlayLayout.java:490)
at android.view.View.measure(View.java:24601)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6831)
at android.widget.FrameLayout.onMeasure(FrameLayout.java:194)
at android.view.View.measure(View.java:24601)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6831)
at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1552)
at android.widget.LinearLayout.measureVertical(LinearLayout.java:842)
at android.widget.LinearLayout.onMeasure(LinearLayout.java:721)
at android.view.View.measure(View.java:24601)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6831)
at android.widget.FrameLayout.onMeasure(FrameLayout.java:194)
at com.android.internal.policy.DecorView.onMeasure(DecorView.java:776)
at android.view.View.measure(View.java:24601)
at android.view.ViewRootImpl.performMeasure(ViewRootImpl.java:3091)
at android.view.ViewRootImpl.measureHierarchy(ViewRootImpl.java:1912)
at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:2207)
at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1800)
at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:7751)
at android.view.Choreographer$CallbackRecord.run(Choreographer.java:967)
at android.view.Choreographer.doCallbacks(Choreographer.java:791)
at android.view.Choreographer.doFrame(Choreographer.java:726)
at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:952)
at android.os.Handler.handleCallback(Handler.java:883)
at android.os.Handler.dispatchMessage(Handler.java:100)
at android.os.Looper.loop(Looper.java:241)
at android.app.ActivityThread.main(ActivityThread.java:7582)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:941)
Пълният код на класа е както следва, ако това помага:
@RequiresApi(Build.VERSION_CODES.O)
class CardsAdapter(
private val cardsContext: Context,
private val resource: Int,
private val cards: MutableMap<Int, Card>
) : ArrayAdapter<Transaction>(cardsContext, resource) {
private val TAG = "CardsAdapter"
private val inflater = LayoutInflater.from(context)
override fun getCount(): Int {
return cards.size
}
override fun getView(position: Int, convertView: View?, parent: ViewGroup): View {
Log.d(TAG, "getView called")
val view: View
val viewHolder: ViewHolderCards
if (convertView == null) {
view = inflater.inflate(resource, parent, false)
viewHolder = ViewHolderCards(view)
view.tag = viewHolder
} else {
view = convertView
viewHolder = view.tag as ViewHolderCards
}
val cardKey1 = cards
val cardKey2 = cardKey1.keys
val cardKey3 = cardKey2.sorted()
val cardKey = cardKey3[1]
val currentCard = cards[cardKey]
viewHolder.txtCartao.text = currentCard?.cardNumber
viewHolder.txtTipoInvestimento.text = currentCard?.getInvestmentType()
viewHolder.txtEditar.setOnClickListener { _ ->
val intent = Intent(cardsContext, EditCardActivity::class.java)
intent.putExtra("cardId", cardKey)
startActivity(cardsContext, intent, null)
}
viewHolder.txtExcluir.setOnClickListener { _ ->
val builder = AlertDialog.Builder(context)
builder.setTitle(context.getString(R.string.atencao))
builder.setMessage(context.getString(R.string.confirmar_excluir))
builder.setPositiveButton(context.getString(R.string.excluir)) { _, _ ->
cards.remove(cardKey)
notifyDataSetChanged()
toast(context, context.getString(R.string.toast_cartao_excluido))
}
builder.setNegativeButton(context.getString(R.string.cancelar)) { _, _ -> }
builder.show()
}
return view
}
}