web-dev-qa-db-fra.com

Vous devez fournir un ID de ressource pour une erreur TextView Android

J'essaie tout ce jour pour résoudre cette erreur. Je ne comprends pas pourquoi mon logcat imprime:

05-06 21: 45: 59.559: 
 ERROR/ConversationList (9023): Nous avons 
 Discussions ... 05-06 21: 45: 59.609: 
 ERROR/ConversationList (9023): 
 UpdateList end ... 05-06 21: 45: 59.839: 
 ERROR/ArrayAdapter (9023): Vous devez
appliquer un ID de ressource pour un TextView 
 05-06 21: 45: 59.839: 
 .DEBUG/AndroidRuntime (9023): Fermeture de 
 VM 05-06 21: 45: 59.839: 
 WARN/dalvikvm (9023): threadid = 3: 
 Thread sortant avec une exception non capturée
 (group = 0x4000fe70) 05-06 21: 45: 59.839: 
 ERREUR/AndroidRuntime (9023): Gestionnaire non capturé 
 gestionnaire: unité principale du thread en raison de 
 exception non capturée 05-06 21: 21: 45: 59.879 : 
 ERROR/AndroidRuntime (9023): 
 Java.lang.IllegalStateException: 
 ArrayAdapter requiert l'ID de la ressource 
est un TextView 05-06 21: 45: 59.879: 
 ERROR/AndroidRuntime (9023): at 
 Android.widget.ArrayAdapter.createViewFromResource (ArrayAdapter.Java:347) 
 05-06 21: 45: 59.879: 
 ERROR/AndroidRuntime (9023): at
Android. widget.ArrayAdapter.getView (ArrayAdapter.Java:323) 
 05-06 21: 45: 59.879: 
 ERREUR/AndroidRuntime (9023): at 
 Android.widget.AbsListView.obtainView (AbsListView.Java:1269) 
 05-06 21: 45: 59.879: 
 ERROR/AndroidRuntime (9023): à 
 Android.widget.ListView.makeAndAddView (ListView.Java:1623) 
 05-06 21: 45: 59.879: 
 ERROR/AndroidRuntime (9023): sur 
 Android.widget.ListView.fillDown (ListView. Java: 607) 
 05-06 21: 45: 59.879: 
 ERREUR/AndroidRuntime (9023): à 
 Android.widget.ListView.fillFromTop (ListView.Java:664) 
 05-06 21: 45: 59.879: 
 ERROR/AndroidRuntime (9023): à 
 Android.widget.ListView.layoutChildren (ListView.Java:1481) 
 05-06 21: 45: 59.879: 
 ERROR/AndroidRuntime (9023): at 
 Android.widget.AbsListView.onLayout (AbsListView.Java:1113) 
 05-06 21: 45: 59.879: 
 ERROR/AndroidRuntime (9023): à 
 Android.view.View.layout (View.Java:6133) 
 05-06 21: 45: 59.879: 
 ERROR/AndroidRuntime (9023): à 
 Android.widget.LinearLayout.setChildFrame (LinearLayout. Java: 1119) 
 05-06 21: 45: 59.879: 
 ERROR/AndroidRuntime (9023): à 
 Et. roid.widget.LinearLayout.layoutVertical (LinearLayout.Java:998) 
 05-06 21: 45: 59.879: 
 ERROR/AndroidRuntime (9023): at 
 Android.widget.LinearLayout.onLayout.onLayout (LinearLayout. Java: 918) 
 05-06 21: 45: 59.879: 
 ERREUR/AndroidRuntime (9023): à 
 Android.view.View.layout (View.Java:6133) 
 05-06 21: 45: 59.879: 
 ERROR/AndroidRuntime (9023): à 
 Android.widget.FrameLayout.onLayout (FrameLayout.Java:333) 
 05-06 21: 45: 59.879: 
 ERROR/AndroidRuntime (9023): at 
 Android.view.View.layout (View.Java:6133) 
 05-06 21: 45: 59.879: 
 ERROR/AndroidRuntime (9023): à 
 Android.widget.LinearLayout.setChildFrame (LinearLayout.Java:1119) 
 05-06 21: 45: 59.879: 
 ERROR/AndroidRuntime (9023): à 
 Android.widget.LinearLayout.layoutVertical (LinearLay.). Java: 998) 
 05-06 21: 45: 59.879: 
 ERREUR/AndroidRuntime (9023): à 
 Android.widget.LinearLayout.onLayout (LinearLayout.Java:918) 
 05-06 21: 45: 59.879: 
 ERROR/AndroidRuntime (9023): à 
 Android.view.View.layout (View.Jav a: 6133) 
 05-06 21: 45: 59.879: 
 ERREUR/AndroidRuntime (9023): à 
 Android.widget.FrameLayout.onLayout (FrameLayout.Java:333) 
 05-06 21: 45: 59.879: 
 ERROR/AndroidRuntime (9023): à 
 Android.view.View.layout (View.Java:6133) 
 05-06 21: 45: 59.879: 
 ERREUR/AndroidRuntime (9023): at 
 Android.view.ViewRoot.performTraversals (ViewRoot.Java:929) 
 05-06 21: 45: 59.879: 
 ERROR/AndroidRuntime (9023): à 
 Android.view.ViewRoot.handleMessage (ViewRoot.Java:1482) 
 05-06 21: 45: 59.879: 
 ERROR/AndroidRuntime (9023): sur 
 Android.os.Handler.dispatchMessage (Gestionnaire. Java: 99) 
 05-06 21: 45: 59.879: 
 ERREUR/AndroidRuntime (9023): sur 
 Android.os.Looper.loop (Looper.Java:123) 
 05-06 21: 45: 59.879: 
 ERROR/AndroidRuntime (9023): à 
 Android.app.ActivityThread.main (ActivityThread.Java:3948) 
 05-06 21: 45: 59.879: 
 ERROR/AndroidRuntime (9023): at 
 Java.lang.reflect.Method.invokeNative (Méthode native .__) 05-06 21: 45: 59.879: 
 ERROR/AndroidRuntime (9023): à 
Java.lang.reflect.Method.invoke (Method.Java:521) 
 05-06 21: 45: 59.879: 
 ERROR/AndroidRuntime (9023): at 
 Com.Android.internal.os .ZygoteInit $ MethodAndArgsCaller.run (ZygoteInit.Java:782) 
 05-06 21: 45: 59.879: 
 ERROR/AndroidRuntime (9023): at 
 Com.Android.internal.os.ZygoteInit.main (ZygoteInit.Java:540)
05-06 21: 45: 59.879: 
 ERROR/AndroidRuntime (9023): at 
 Dalvik.system.NativeStart.main (Native 
 Method) 05-06 21: 45: 59.879: 
 ERROR/AndroidRuntime (9023): Causée par: 
 Java.lang.ClassCastException: 
 Android.widget.LinearLayout 05-06 
 21: 45: 59.879: 
 .ERROR/AndroidRuntime (9023): at 
 Android.widget.ArrayAdapter.createViewFromResource (ArrayAdapter.Java:340) 
 05-06 21: 45: 59.879: 
 ERROR/AndroidRuntime (9023): .. . 30 
 Plus

Mon fichier Java:

package fshizzle.com;

import Java.util.ArrayList;

import Android.app.ListActivity;
import Android.app.NotificationManager;
import Android.content.BroadcastReceiver;
import Android.content.Context;
import Android.content.Intent;
import Android.content.IntentFilter;
import Android.database.Cursor;
import Android.database.sqlite.SQLiteDatabase;
import Android.os.Bundle;
import Android.util.Log;
import Android.view.ContextMenu;
import Android.view.MenuInflater;
import Android.view.MenuItem;
import Android.view.View;
import Android.widget.AdapterView.AdapterContextMenuInfo;
import Android.widget.ArrayAdapter;
import Android.widget.ListAdapter;
import Android.widget.ListView;
import Android.widget.TextView;
import cz.jabbim.Android.data.JabberoidDbConnector;
import fshizzle.com.R;

public class ConversationList extends ListActivity {

//  private static final String TAG = "ConversationList.class";
    private static final int RESULT_CHAT = 4004;
    private static final int RESULT_DIRECTCHAT = 4005;

    private static final String TAG = "ConversationList";

    private ArrayList<String> chatList = new ArrayList<String>();

    private TextView tv;

    private String lastJid;
    BroadcastReceiver csr;
    IntentFilter f;

    boolean show = true;

    @Override
    public void onCreate(Bundle icicle) {
        super.onCreate(icicle);

        setContentView(R.layout.conversationlist);

        tv = (TextView)findViewById(R.id.contactList_NoConversation);

        csr =  new BroadcastReceiver() {
            @Override
            public void onReceive(Context context, Intent intent) {
                getChats();
                updateList(false);
            }
        };
        f = new IntentFilter();
        f.addAction("cz.jabbim.Android.androidim.NEW_MESSAGE");

        registerForContextMenu(getListView());

    }

    @Override
    public void onStart() {
        super.onStart();
        getChats();
        updateList(show);
        show = true;
        if(getIntent().getBooleanExtra("startChat", false)) {
            startChat(getIntent().getStringExtra("jid"));
            show = false;
        }

    }

    @Override
    public void onResume() {
        super.onResume();
        cancelNotification();

        registerReceiver(csr, f);
    }

    @Override
    public void onPause() {
        super.onPause();
        unregisterReceiver(csr);

    }

    @Override
    public void onStop() {
        super.onStop();

    }

    @Override
    protected void onListItemClick(ListView lv, View v, int pos, long id) {
        super.onListItemClick(lv, v, pos, id);
        startChat(pos);     
    }

    @Override
    public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {
        new MenuInflater(getApplication()).inflate(R.menu.conversationlist_context, menu);
        AdapterContextMenuInfo acmi = (AdapterContextMenuInfo)menuInfo;
        menu.setHeaderTitle("Chat with " + getJid(acmi.position));

        super.onCreateContextMenu(menu, v, menuInfo);
    }

    @Override
    public boolean onContextItemSelected(MenuItem item) {
        AdapterContextMenuInfo acmi = (AdapterContextMenuInfo) item.getMenuInfo();
        switch(item.getItemId()) {
        case R.id.menuEnter:
            startChat(acmi.position);
            return true;
        case R.id.menuCloseChat:
            closeChat(acmi.position);
            return true;
        }


        return super.onContextItemSelected(item);
    }

    private int getChats() {
        final String[] returnColumns = {
                Constants.TABLE_CONVERSATION_FIELD_ID,
                Constants.TABLE_CONVERSATION_FIELD_CHAT,
                "MIN("+(Constants.TABLE_CONVERSATION_FIELD_DATE)+") as 'firstReceived'",
               };

        SQLiteDatabase db = new JabberoidDbConnector(this).getWritableDatabase();

        Cursor result = db.query(Constants.TABLE_CONVERSATION, 
                returnColumns, 
                null, //Constants.TABLE_CONVERSATION_FIELD_FROM + "!= 'me'", 
                null, 
                Constants.TABLE_CONVERSATION_FIELD_CHAT, 
                null, 
                "firstReceived ASC" );

        int count = result.getCount();

        chatList.clear();
        result.moveToFirst();
        while(!result.isAfterLast()) {
            chatList.add(result.getString(result.getColumnIndex(Constants.TABLE_CONVERSATION_FIELD_CHAT)));
            //chatList.add("[email protected]");
            result.moveToNext();
        }

        result.close();
        result = null;
        db.close();

        return count;
    }



        private void updateList(boolean startChat) {
        if(chatList.size() > 0) {

            if(chatList.size()==1 && startChat) {
                startChat(0);
            }
            Log.e(TAG, "We have chats...");
            tv.setVisibility(View.GONE);
            getListView().setVisibility(View.VISIBLE);





            ListAdapter adapter = new ArrayAdapter<String>(
                    this,
                    R.layout.conversation_item,
                    chatList
                );
            getListView().setAdapter(adapter);

            //startChat("[email protected]");

        //  startChat(getIntent().getStringExtra("fromUser"));

        } else {
            Log.e(TAG, "We don't have chats...");
            getListView().setVisibility(View.GONE);
            tv.setVisibility(View.VISIBLE);
            tv.setText(R.string.conversationList_noOpenConversation);
        }

        // close the database after usage
        Log.e(TAG, "UpdateList end...");
    }

    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        if(requestCode==RESULT_CHAT) {

            int chats = getChats();

            if(chats==0) {
                finish();
            } else if(chats==1) {
                String jid;

                jid = getJid(0);

                if(lastJid.equals(jid)) {
                    finish();       
                } else {
                    show = false;
                }
            } else {
                show = false;
            }

        } else if (requestCode==RESULT_DIRECTCHAT) {
            finish();
        }
    }

    private void cancelNotification() {
        NotificationManager nm = (NotificationManager)getSystemService(NOTIFICATION_SERVICE);
        nm.cancel(Constants.NEW_MESSAGE_NOTIFICATION);
    }

    private void startChat(int pos) {
        String jid = getJid(pos);
        lastJid = jid;
        finishActivity(RESULT_CHAT);
        Intent i = new Intent(this, Conversations.class);
        i.putExtra("jid", jid);
        startActivityForResult(i, RESULT_CHAT);
        setResult(RESULT_OK);
        finish();
    }

    private void startChat(String jid) {
        finishActivity(RESULT_DIRECTCHAT);
        Intent i = new Intent(this, Conversations.class);
        i.putExtra("jid", jid);
        startActivityForResult(i, RESULT_DIRECTCHAT);
        setResult(RESULT_OK);
        finish();
    }

    private void closeChat(int pos) {
        SQLiteDatabase db = new JabberoidDbConnector(this).getWritableDatabase();
        db.delete(Constants.TABLE_CONVERSATION,
                Constants.TABLE_CONVERSATION_FIELD_CHAT + " = '" + getJid(pos) + "'",
                null);
        db.close();
        getChats();
        updateList(false);

    }

    private String getJid(int pos) {
        return chatList.get(pos);
    }

//  private void handleUpdateList() {

//  }

}
`

L'erreur est ici:

ListAdapter adapter = new ArrayAdapter<String>(
        this,
        R.layout.conversation_item,
        chatList
);
getListView().setAdapter(adapter);

Aucune erreur quand je l'enlève.

ListAdapter adapter = new ArrayAdapter<String>(
        this,
        R.layout.conversation_item,
        chatList
);
getListView().setAdapter(adapter);

Quelle est la solution s'il vous plaît?

conversation_item.xml

<?xml version="1.0" encoding="UTF-8"?>
 <LinearLayout 
      Android:layout_width="fill_parent" 
      Android:layout_height="fill_parent" 
      xmlns:Android="http://schemas.Android.com/apk/res/Android"

      Android:id="@+id/conversation_item">

          <TextView 
              Android:layout_height="wrap_content" 
              Android:id="@+id/conversation_item_name" 
              Android:text="Name Surname" 
              Android:textColor="#ffffff" 
              Android:textStyle="bold" 
              Android:textSize="16dip" 
              Android:layout_width="fill_parent" 
              Android:layout_marginTop="10dip" 
              Android:layout_marginBottom="10dip" 
              Android:layout_marginLeft="10dip">
          </TextView>
          <TextView 
              Android:layout_height="wrap_content" 
              Android:id="@+id/conversation_item_date" 
              Android:layout_width="fill_parent" 
              Android:text="17.6.2010 15:30">
          </TextView>
          <TextView 
              Android:layout_height="wrap_content"
              Android:layout_width="fill_parent" 
              Android:id="@+id/conversation_item_message" 
              Android:text="Just some message..." 
              Android:textColor="#ffffff">
          </TextView>   
</LinearLayout>
21
user2080866

Je suis à peu près sûr que le problème réside dans votre mise en page conversation_item. Docs indique que vous devez fournir une ressource avec un single TextView. A quoi ressemble cette mise en page?

Par exemple, voici à quoi ressemble la présentation simple_list_item_1, la vôtre devrait être assez similaire.

<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:id="@Android:id/text1"
    Android:layout_width="fill_parent"
    Android:layout_height="wrap_content"
    Android:textAppearance="?android:attr/textAppearanceLarge"
    Android:gravity="center_vertical"
    Android:paddingLeft="6dip"
    Android:minHeight="?android:attr/listPreferredItemHeight"
/>

MODIFIER:

Je viens de modifier la question pour que votre mise en page apparaisse. Votre disposition est en effet incorrecte, vous ne pouvez pas avoir la disposition linéaire ici si vous utilisez ce constructeur. Vous pouvez utiliser l'autre constructeur (ArrayAdapter(Context context, int resource, int textViewResourceId, T[] objects)) et fournir votre mise en page personnalisée et votre identifiant TextView.

31
dmon

Avait le même problème, avait besoin de changer l'adaptateur personnalisé à partir de:

  ListAdapter adapter = new ArrayAdapter<String>(
            this,
            R.layout.conversation_item,
            chatList
        );
    getListView().setAdapter(adapter);

à:

  ListAdapter adapter = new ArrayAdapter<String>(
            this,
            R.layout.conversation_item,
            R.id.sometextview_from_the_layout,
            chatList
        );
    getListView().setAdapter(adapter);

Je pense que la TextView sélectionnée sera utilisée pour générer le rowid, ce qui peut expliquer son besoin d'être unique, mais je ne suis pas encore sûr.

27
Kamil Maciejewski

Il est préférable d'utiliser un adaptateur personnalisé chaque fois qu'un tableau d'objets doit être répertorié dans une vue de présentation personnalisée. Reportez-vous à cette référence simple et esthétique Remplissage d’une vue de liste avec un adaptateur personnalisé

1
randomness

Le constructeur que vous utilisez est strictement un CheckedTextView. Le problème se pose parce que vous fournissez également une mise en page linéaire dans votre fichier XML. La solution la plus simple consiste à supprimer la disposition linéaire et à ne conserver que le CheckedTextView. À votre santé!

0
Ketan Dubey