ClassCastException (String to Number) при опит за достъп до елемент от списък

Получавам наистина странен проблем, който не мога да разбера.

Просто се опитвам да осъществя достъп до елемент от списък с прост инструмент за получаване, но продължавам да получавам изключение 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
    }
}

person Rafael Lobo    schedule 01.03.2021    source източник


Отговори (2)


Грешката може да е в този ред:

viewHolder.txtCartao.text = currentCard?.cardNumber

Тъй като номерът на картата е число, а текстът е низ.

person ruba    schedule 01.03.2021

viewHolder.txtCartao.text = currentCard?.cardNumber
viewHolder.txtTipoInvestimento.text = currentCard?.getInvestmentType()

Съгласен съм с @ruba, стойността в setText на TextView трябва да бъде низ или нула.

person leo    schedule 01.03.2021
comment
Не, cardNumber всъщност е низ (стойността му е нещо като XXXX XXXX XXXX 0001. Освен това изключението сочи към реда cardKey = cardKey3 - person Rafael Lobo; 01.03.2021
comment
@RafaelLobo Изглежда, че видях грешката ви, private val cards: MutableMap<Int, Card> ключът, който използвате, е Int, но използвате String в ред val currentCard = cards[cardKey], това ще хвърли изключение. - person leo; 02.03.2021