IllegalStateException: ArrayAdapter requiere que el ID de recurso sea un TextView

Ejecuté mi código una vez y estaba bien, lo ejecuté de nuevo y ahora falla cada vez. LogCat me dio esto:

04-11 03:15:57.293: D/dalvikvm(344): GC_EXTERNAL_ALLOC freed 68K, 52% free 2588K/5379K,   external 1907K/2137K, paused 65ms
04-11 03:15:57.497: E/ArrayAdapter(344): You must supply a resource ID for a TextView
04-11 03:15:57.497: D/AndroidRuntime(344): Shutting down VM
04-11 03:15:57.497: W/dalvikvm(344): threadid=1: thread exiting with uncaught exception (group=0x40015560)
04-11 03:15:57.573: E/AndroidRuntime(344): FATAL EXCEPTION: main
04-11 03:15:57.573: E/AndroidRuntime(344): java.lang.IllegalStateException: ArrayAdapter requires the resource ID to be a TextView
04-11 03:15:57.573: E/AndroidRuntime(344):  at android.widget.ArrayAdapter.createViewFromResource(ArrayAdapter.java:347)
04-11 03:15:57.573: E/AndroidRuntime(344):  at android.widget.ArrayAdapter.getView(ArrayAdapter.java:323)
04-11 03:15:57.573: E/AndroidRuntime(344):  at android.widget.AbsListView.obtainView(AbsListView.java:1430)
04-11 03:15:57.573: E/AndroidRuntime(344):  at android.widget.ListView.measureHeightOfChildren(ListView.java:1216)
04-11 03:15:57.573: E/AndroidRuntime(344):  at android.widget.ListView.onMeasure(ListView.java:1127)
04-11 03:15:57.573: E/AndroidRuntime(344):  at android.view.View.measure(View.java:8313)
04-11 03:15:57.573: E/AndroidRuntime(344):  at android.widget.RelativeLayout.measureChild(RelativeLayout.java:566)
04-11 03:15:57.573: E/AndroidRuntime(344):  at android.widget.RelativeLayout.onMeasure(RelativeLayout.java:381)
04-11 03:15:57.573: E/AndroidRuntime(344):  at android.view.View.measure(View.java:8313)
04-11 03:15:57.573: E/AndroidRuntime(344):  at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:3138)
04-11 03:15:57.573: E/AndroidRuntime(344):  at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1017)
04-11 03:15:57.573: E/AndroidRuntime(344):  at android.widget.LinearLayout.measureVertical(LinearLayout.java:386)
04-11 03:15:57.573: E/AndroidRuntime(344):  at android.widget.LinearLayout.onMeasure(LinearLayout.java:309)
04-11 03:15:57.573: E/AndroidRuntime(344):  at android.view.View.measure(View.java:8313)
04-11 03:15:57.573: E/AndroidRuntime(344):  at android.widget.RelativeLayout.measureChildHorizontal(RelativeLayout.java:581)
04-11 03:15:57.573: E/AndroidRuntime(344):  at android.widget.RelativeLayout.onMeasure(RelativeLayout.java:365)
04-11 03:15:57.573: E/AndroidRuntime(344):  at android.view.View.measure(View.java:8313)
04-11 03:15:57.573: E/AndroidRuntime(344):  at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:3138)
04-11 03:15:57.573: E/AndroidRuntime(344):  at android.widget.FrameLayout.onMeasure(FrameLayout.java:250)
04-11 03:15:57.573: E/AndroidRuntime(344):  at android.view.View.measure(View.java:8313)
04-11 03:15:57.573: E/AndroidRuntime(344):  at android.widget.LinearLayout.measureVertical(LinearLayout.java:531)
04-11 03:15:57.573: E/AndroidRuntime(344):  at android.widget.LinearLayout.onMeasure(LinearLayout.java:309)
04-11 03:15:57.573: E/AndroidRuntime(344):  at android.view.View.measure(View.java:8313)
04-11 03:15:57.573: E/AndroidRuntime(344):  at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:3138)
04-11 03:15:57.573: E/AndroidRuntime(344):  at android.widget.FrameLayout.onMeasure(FrameLayout.java:250)
04-11 03:15:57.573: E/AndroidRuntime(344):  at android.view.View.measure(View.java:8313)
04-11 03:15:57.573: E/AndroidRuntime(344):  at android.view.ViewRoot.performTraversals(ViewRoot.java:839)
04-11 03:15:57.573: E/AndroidRuntime(344):  at android.view.ViewRoot.handleMessage(ViewRoot.java:1859)
04-11 03:15:57.573: E/AndroidRuntime(344):  at android.os.Handler.dispatchMessage(Handler.java:99)
04-11 03:15:57.573: E/AndroidRuntime(344):  at android.os.Looper.loop(Looper.java:123)
04-11 03:15:57.573: E/AndroidRuntime(344):  at android.app.ActivityThread.main(ActivityThread.java:3683)
04-11 03:15:57.573: E/AndroidRuntime(344):  at java.lang.reflect.Method.invokeNative(Native Method)
04-11 03:15:57.573: E/AndroidRuntime(344):  at java.lang.reflect.Method.invoke(Method.java:507)
04-11 03:15:57.573: E/AndroidRuntime(344):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
04-11 03:15:57.573: E/AndroidRuntime(344):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
04-11 03:15:57.573: E/AndroidRuntime(344):  at dalvik.system.NativeStart.main(Native Method)
04-11 03:15:57.573: E/AndroidRuntime(344): Caused by: java.lang.ClassCastException: android.widget.RelativeLayout
04-11 03:15:57.573: E/AndroidRuntime(344):  at android.widget.ArrayAdapter.createViewFromResource(ArrayAdapter.java:340)
04-11 03:15:57.573: E/AndroidRuntime(344):  ... 35 more
04-11 03:17:31.694: I/Process(344): Sending signal. PID: 344 SIG: 9

Tengo tres actividades:

package com.androidbook.triviaquiz;

import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.TextView;

public class QuizMenuActivity extends QuizActivity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.menu);

        ListView menuList = (ListView) findViewById(R.id.listView1);

        String[] items = { getResources().getString(R.string.itemplay),
                getResources().getString(R.string.itemscores),
                getResources().getString(R.string.itemsettings),
                getResources().getString(R.string.itemhelp) };
        ArrayAdapter<String> adapt = new ArrayAdapter<String>(this, R.layout.menu, items);
        menuList.setAdapter(adapt);

        menuList.setOnItemClickListener(new AdapterView.OnItemClickListener() {

            public void onItemClick(AdapterView<?> parent, View itemClicked, int position, long id) {

                // Note: if the list was built "by hand" the id could be used.
                // As-is, though, each item has the same id

                TextView textView = (TextView) itemClicked;
                String strText = textView.getText().toString();

                if (strText.equalsIgnoreCase(getResources().getString(R.string.itemplay))) {
                    // Launch the Game Activity
                    startActivity(new Intent(QuizMenuActivity.this, QuizGameActivity.class));
                } else if (strText.equalsIgnoreCase(getResources().getString(R.string.itemhelp))) {
                    // Launch the Help Activity
                    startActivity(new Intent(QuizMenuActivity.this, QuizHelpActivity.class));
                } else if (strText.equalsIgnoreCase(getResources().getString(R.string.itemsettings))) {
                    // Launch the Settings Activity
                    startActivity(new Intent(QuizMenuActivity.this, QuizSettingsActivity.class));
                } else if (strText.equalsIgnoreCase(getResources().getString(R.string.itemscores))) {
                    // Launch the Scores Activity
                    startActivity(new Intent(QuizMenuActivity.this, QuizScoresActivity.class));
                }

            }
        });


    }


}

éste:

package com.androidbook.triviaquiz;

import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.TextView;

public class QuizMenuActivity extends QuizActivity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.menu);

        ListView menuList = (ListView) findViewById(R.id.listView1);

        String[] items = { getResources().getString(R.string.itemplay),
                getResources().getString(R.string.itemscores),
                getResources().getString(R.string.itemsettings),
                getResources().getString(R.string.itemhelp) };
        ArrayAdapter<String> adapt = new ArrayAdapter<String>(this, R.layout.menu, items);
        menuList.setAdapter(adapt);

        menuList.setOnItemClickListener(new AdapterView.OnItemClickListener() {

            public void onItemClick(AdapterView<?> parent, View itemClicked, int position, long id) {

                // Note: if the list was built "by hand" the id could be used.
                // As-is, though, each item has the same id

                TextView textView = (TextView) itemClicked;
                String strText = textView.getText().toString();

                if (strText.equalsIgnoreCase(getResources().getString(R.string.itemplay))) {
                    // Launch the Game Activity
                    startActivity(new Intent(QuizMenuActivity.this, QuizGameActivity.class));
                } else if (strText.equalsIgnoreCase(getResources().getString(R.string.itemhelp))) {
                    // Launch the Help Activity
                    startActivity(new Intent(QuizMenuActivity.this, QuizHelpActivity.class));
                } else if (strText.equalsIgnoreCase(getResources().getString(R.string.itemsettings))) {
                    // Launch the Settings Activity
                    startActivity(new Intent(QuizMenuActivity.this, QuizSettingsActivity.class));
                } else if (strText.equalsIgnoreCase(getResources().getString(R.string.itemscores))) {
                    // Launch the Scores Activity
                    startActivity(new Intent(QuizMenuActivity.this, QuizScoresActivity.class));
                }

            }
        });


    }


}

y éste:

package com.androidbook.triviaquiz;


import android.content.Intent;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;

public class QuizGameActivity extends QuizActivity {


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.game);
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        super.onCreateOptionsMenu(menu);
        getMenuInflater().inflate(R.menu.gameoptions, menu);
        menu.findItem(R.id.help_menu_item).setIntent(new Intent(this, QuizHelpActivity.class));
        menu.findItem(R.id.settings_menu_item).setIntent(new Intent(this, QuizSettingsActivity.class));
        return true;
    }
     @Override
       public boolean onOptionsItemSelected(MenuItem item) {
          super.onOptionsItemSelected(item);
          startActivity(item.getIntent());
           return true;
        }
}

¿Alguien puede decirme qué está mal con este código? Como dije antes, todo lo que hice fue reiniciarlo. ¿Son estas las únicas cosas que necesita para resolverlo, tal vez el manifiesto?

EDITAR: Res/diseño/menú

<RelativeLayout 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"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context=".QuizSplashActivity" >

    <LinearLayout
        android:id="@+id/linearLayout1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:layout_alignParentLeft="true"
        android:layout_alignParentRight="true"
        android:layout_alignParentTop="true"
        android:background="@drawable/th"
        android:orientation="vertical" >

        <RelativeLayout
            android:layout_width="match_parent"
            android:layout_height="50dp"
            android:background="#000000" >

            <ImageView
                android:id="@+id/ImageView2"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_alignParentLeft="true"
                android:layout_alignParentTop="true"
                android:src="@drawable/quizicon" />

            <TextView
                android:id="@+id/textView1"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_alignParentTop="true"
                android:layout_centerHorizontal="true"
                android:text="MAIN MENU"
                android:textColor="#ffffff"
                android:textSize="20pt" />

            <ImageView
                android:id="@+id/imageView1"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_alignParentRight="true"
                android:layout_alignParentTop="true"
                android:src="@drawable/quizicon" />
        </RelativeLayout>

        <RelativeLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content" >

            <ListView
                android:id="@+id/listView1"
                android:layout_width="fill_parent"
                android:layout_height="wrap_content"
                android:layout_alignParentTop="true"
                android:gravity="center">



            </ListView>

        </RelativeLayout>

    </LinearLayout>

</RelativeLayout>

preguntado el 11 de abril de 13 a las 04:04

me encanta el titulo... -

Muéstranos res/layout/menu.xml por favor -

gracias tigger y ahí tienes Karakuri -

5 Respuestas

Tienes que especificar tu TextView ID que usaste en tu R.layout.menu

Cambia esto :

ArrayAdapter<String> adapt = new ArrayAdapter<String>(this, R.layout.menu, items); 

A esto :

ArrayAdapter<String> adapt = new ArrayAdapter<String>(this, R.layout.menu, R.id.YOUR_TEXT_VIEW, items); 

Respondido 30 Abr '13, 09:04

@Vipul Purohit Si creo una fila de lista sin TextView, ¿cómo puedo implementar en ArrayAdapter? hay alguna manera ? - Karthikeyan ve

Simplemente puede crear un ArrayAdapter personalizado extendiendo su clase al adaptador de matriz. - Vipul Purohit

El constructor de ArrayAdapter que está utilizando espera un recurso de diseño que consiste solo en un TextView. Intentará vincular los datos de la lista a TextView. En su lugar, encuentra un RelativeLayout y falla.

Parece que le diste el diseño de tu Actividad. ¿Quizás quisiste darle un recurso de diseño diferente? De lo contrario, debe usar un constructor diferente que tome tanto un recurso de diseño como la identificación de una vista de texto dentro de ese diseño.

ArrayAdapter<String> adapter = new ArrayAdapter<String>(context, R.layout.list_item, R.layout.text, items);

Respondido 11 Abr '13, 04:04

la excepción es bastante clara en mi humilde opinión: ArrayAdapter requiere que el ID de recurso sea un TextView, consulte los documentos:

Un ListAdapter que administra un ListView respaldado por una matriz de objetos arbitrarios.

De forma predeterminada, esta clase espera que el ID de recurso proporcionado haga referencia a un solo TextView. Si desea usar un diseño más complejo, use los constructores que también toman una identificación de campo. Esa identificación de campo debe hacer referencia a un TextView en el recurso de diseño más grande.

Sin embargo, se hace referencia a TextView, se llenará con toString() de cada objeto en la matriz. Puede agregar listas o matrices de objetos personalizados. Anule el método toString() de sus objetos para determinar qué texto se mostrará para el elemento de la lista.

Para usar algo que no sea TextViews para la visualización de la matriz, por ejemplo, ImageViews, o para que algunos datos además de los resultados de toString() llenen las vistas, anule getView(int, View, ViewGroup) para devolver el tipo de vista que desea.

Respondido 07 Oct 13, 16:10

ArrayAdapter<String> adapt = new ArrayAdapter<String>(this, R.layout.menu, items);

está creando un adaptador de matriz con el constructor donde solo está dando 3 parámetros: contexto, textview resourceId y listItems.

Entonces, en lugar del diseño, espera la identificación de la vista de texto donde se deben configurar los datos.

En caso de que necesite enviar la identificación del diseño también, use otro constructor y pase textviewresourceId como 0.

como este

mAdapter = new ArrayAdapter(mContext, R.layout.custom_layout, 0, itemsList);

Si tiene un ID de recurso de vista de texto, puede pasar el ID de recurso en lugar de 0

Espero que esto funcione para ti.

Respondido 11 Abr '13, 04:04

Puede usar "layout.support_simple_spinner_dropdown_item" tal como se indica a continuación.

YourArrayAdapter = new ArrayAdapter<String>(this, R.layout.support_simple_spinner_dropdown_item);

Respondido 24 Feb 20, 14:02

Agregue más detalles a su respuesta y use formato para códigos: MehrdadEP

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.