Search code examples
androidandroid-fragmentsandroid-listviewandroid-arrayadapter

My App crashes when I try to use ArrayAdapter


Whenever I try to implement the ArrayAdapter on my ListView in my MainActivity.kt file, my app crashes. Once I comment it out, my app is able to run but, of course, it doesn't display the list of names that I want it.

This hasn't given me an issue before and even Googling it hasn't given me much insight into the problem I'm facing. I'm not sure if it may be caused due to me using Fragments as well as Activities. If anyone has any insights, it'd be greatly appreciated

main.kt:

package com.example.contactslist

import android.os.Bundle
import androidx.fragment.app.Fragment
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup

/**
* A simple [Fragment] subclass.
*/
class main : Fragment() {

override fun onCreateView(
    inflater: LayoutInflater, container: ViewGroup?,
    savedInstanceState: Bundle?
): View? {
    // Inflate the layout for this fragment
    return inflater.inflate(R.layout.fragment_main, container, false)
}
}

MainActivity.kt:

package com.example.contactslist

import android.content.Intent
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.widget.ArrayAdapter
import android.widget.Button
import android.widget.ListView

class MainActivity : AppCompatActivity() {

var CONTACT_DETAIL_ACTIVITY_REQUEST = 0

val names = ArrayList<String>()
val numbers = ArrayList<Int>()
// Variable to hold relationships

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)

    names.add("Baraka")
    names.add("Blandy")
    numbers.add(732)
    numbers.add(666)

    val contactsAdapter = ArrayAdapter(this, R.layout.activity_listview, names)
    val listView1 = findViewById<ListView>(R.id.contact_list)
    listView1.setAdapter(contactsAdapter)

    val add_new_contact = findViewById<Button>(R.id.add_contacts)

    add_new_contact.setOnClickListener {
        val name = ""
        val phone_number = 1
        val relationship = ArrayList<String>()

        val intent1 = Intent(this,ContactDetails::class.java)
        startActivityForResult(intent1, CONTACT_DETAIL_ACTIVITY_REQUEST)
    }
}
}

fragment_main.xml:

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
xmlns:app="http://schemas.android.com/apk/res-auto"
tools:context=".main">

<!-- TODO: Update blank fragment layout -->
<TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="Contacts"
    android:textSize="30sp"
    app:layout_constraintTop_toTopOf="parent"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintEnd_toEndOf="parent"
    >
</TextView>

<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    >

    <ListView
        android:id="@+id/contact_list"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        >
    </ListView>

</LinearLayout>

<Button
    android:id="@+id/delete_contacts"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:clickable="true"
    android:text="Delete"
    app:layout_constraintBottom_toBottomOf="parent"
    app:layout_constraintEnd_toEndOf="parent"
    >
</Button>

<Button
    android:id="@+id/add_contacts"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:clickable="true"
    android:text="Add"
    app:layout_constraintBottom_toBottomOf="parent"
    app:layout_constraintStart_toStartOf="parent"
    >
</Button>

</androidx.constraintlayout.widget.ConstraintLayout>

activity_main.xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".MainActivity">

<fragment
    android:id="@+id/fragment"
    android:name="com.example.contactslist.main"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    />

</LinearLayout>

activity_listview.xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/contact_list"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:descendantFocusability="blocksDescendants">

<!--    <CheckBox-->
<!--        android:layout_width="match_parent"-->
<!--        android:layout_height="match_parent"-->
<!--        android:id="@+id/checked"-->
<!--        android:checked="false"/>-->

<TextView
    android:id="@+id/contact_name"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:gravity="center"
    android:textSize="20sp"/>

</LinearLayout>

EDIT: Here's the LogCat Error Log -

10-09 21:19:25.953 21333-21333/? I/art: Not late-enabling -Xcheck:jni (already on) 10-09 21:19:26.167 21333-21339/? E/art: Failed sending reply to debugger: Broken pipe 10-09 21:19:26.168 21333-21339/? I/art: Debugger is no longer active 10-09 21:19:26.736 21333-21333/? W/System: ClassLoader referenced unknown path: /data/app/com.example.contactslist-1/lib/x86 10-09 21:19:27.245 21333-21333/com.example.contactslist W/art: Before Android 4.1, method android.graphics.PorterDuffColorFilter androidx.vectordrawable.graphics.drawable.VectorDrawableCompat.updateTintFilter(android.graphics.PorterDuffColorFilter, android.content.res.ColorStateList, android.graphics.PorterDuff$Mode) would have incorrectly overridden the package-private method in android.graphics.drawable.Drawable 10-09 21:19:27.618 21333-21333/com.example.contactslist I/art: Rejecting re-init on previously-failed class java.lang.Class 10-09 21:19:27.618 21333-21333/com.example.contactslist I/art: Rejecting re-init on previously-failed class java.lang.Class 10-09 21:19:27.725 21333-21333/com.example.contactslist W/art: Verification of void androidx.core.view.ViewCompat.dispatchFinishTemporaryDetach(android.view.View) took 103.153ms 10-09 21:19:27.972 21333-21343/com.example.contactslist I/art: Background partial concurrent mark sweep GC freed 2073(241KB) AllocSpace objects, 0(0B) LOS objects, 52% free, 925KB/1949KB, paused 1.940ms total 150.819ms 10-09 21:19:28.074 21333-21370/com.example.contactslist D/OpenGLRenderer: Use EGL_SWAP_BEHAVIOR_PRESERVED: true 10-09 21:19:28.268 21333-21333/com.example.contactslist E/ArrayAdapter: You must supply a resource ID for a TextView 10-09 21:19:28.269 21333-21333/com.example.contactslist D/AndroidRuntime: Shutting down VM 10-09 21:19:28.271 21333-21333/com.example.contactslist E/AndroidRuntime: FATAL EXCEPTION: main Process: com.example.contactslist, PID: 21333 java.lang.IllegalStateException: ArrayAdapter requires the resource ID to be a TextView at android.widget.ArrayAdapter.createViewFromResource(ArrayAdapter.java:393) at android.widget.ArrayAdapter.getView(ArrayAdapter.java:369) at android.widget.AbsListView.obtainView(AbsListView.java:2346) at android.widget.ListView.measureHeightOfChildren(ListView.java:1280) at android.widget.ListView.onMeasure(ListView.java:1188) at android.view.View.measure(View.java:18788) at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5951) at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1465) at android.widget.LinearLayout.measureVertical(LinearLayout.java:748) at android.widget.LinearLayout.onMeasure(LinearLayout.java:630) at android.view.View.measure(View.java:18788) at androidx.constraintlayout.widget.ConstraintLayout.internalMeasureChildren(ConstraintLayout.java:1227) at androidx.constraintlayout.widget.ConstraintLayout.onMeasure(ConstraintLayout.java:1572) at android.view.View.measure(View.java:18788) at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5951) at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1465) at android.widget.LinearLayout.measureVertical(LinearLayout.java:748) at android.widget.LinearLayout.onMeasure(LinearLayout.java:630) at android.view.View.measure(View.java:18788) at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5951) at android.widget.FrameLayout.onMeasure(FrameLayout.java:194) at androidx.appcompat.widget.ContentFrameLayout.onMeasure(ContentFrameLayout.java:143) at android.view.View.measure(View.java:18788) at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5951) at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1465) at android.widget.LinearLayout.measureVertical(LinearLayout.java:748) at android.widget.LinearLayout.onMeasure(LinearLayout.java:630) at android.view.View.measure(View.java:18788) at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5951) at android.widget.FrameLayout.onMeasure(FrameLayout.java:194) at android.view.View.measure(View.java:18788) at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5951) at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1465) at android.widget.LinearLayout.measureVertical(LinearLayout.java:748) at android.widget.LinearLayout.onMeasure(LinearLayout.java:630) at android.view.View.measure(View.java:18788) at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5951) at android.widget.FrameLayout.onMeasure(FrameLayout.java:194) at com.android.internal.policy.PhoneWindow$DecorView.onMeasure(PhoneWindow.java:2643) at android.view.View.measure(View.java:18788) at android.view.ViewRootImpl.performMeasure(ViewRootImpl.java:2100) at android.view.ViewRootImpl.measureHierarchy(ViewRootImpl.java:1216) at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1452) at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1107) at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:6013) at android.view.Choreographer$CallbackRecord.run(Choreographer.java:858) at android.view.Choreographer.doCallbacks(Choreographer.java:670) at android.view.Choreographer.doFrame(Choreographer.java:606) at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:844) at android.os.Handler.handleCallback(Handler.java:739) at android.os.Handler.dispatchMessage(Handler.java:95) at android.os.Looper.loop(Looper.java:148) at android.app.ActivityThread.main(ActivityThread.java:5417) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) Caused by: java.lang.ClassCastException: android.widget.LinearLayout cannot be cast to android.widget.TextView at android.widget.ArrayAdapter.create


Solution

  • To fix your crash in activity_listview.xml replace

    android:id="@+id/contact_name"
    

    with

    android:id="@android:id/text1"