it-swarm.com.de

Sie müssen eine Ressourcen-ID für einen TextView-Android-Fehler angeben

Ich versuche den ganzen Tag, um diesen Fehler zu beheben. Ich verstehe nicht, warum mein Logcat druckt:

05-06 21: 45: 59.559: 
 ERROR/ConversationList (9023): Wir haben 
 Chats ... 05-06 21: 45: 59.609: 
 ERROR/ConversationList (9023): 
 UpdateList end ... 05-06 21: 45: 59.839: 
 ERROR/ArrayAdapter (9023): Sie müssen eine Ressourcen-ID für eine TextView 
 05. 21: 45: 59.839: 
 .DEBUG/AndroidRuntime (9023): Herunterfahren von 
 Down VM 05-06 21: 45: 59.839: 
 WARN/dalvikvm (9023): threadid = 3: 
 Thread wird mit einer nicht erfassten Ausnahme beendet
 (group = 0x4000fe70) 05-06 21: 45: 59.839: 
 ERROR/AndroidRuntime (9023): Nicht erfasst 
 Handler: Thread-Main wird aufgrund von 
 Nicht erfasste Ausnahme 05-06 21: 45: 59.879 beendet : 
 ERROR/AndroidRuntime (9023): 
 Java.lang.IllegalStateException: 
 ArrayAdapter erfordert die Ressourcen-ID
, um eine TextView 05-06 21: 45: 59.879: 
 ERROR/AndroidRuntime zu sein (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: 
 ERROR/AndroidRuntime (9023): at 
 Android.widget.AbsListView.obtainView (AbsListView.Java:1269) 
 05-06 21: 45: 59.879: 
 ERROR/AndroidRuntime (9023): at 
 Android.widget.ListView.makeAndAddView (ListView.Java:1623) 
 05-06 21: 45: 59.879: 
 ERROR/AndroidRuntime (9023): um 
 Android.widget.ListView.fillDown (ListView. Java: 607) 
 05-06 21: 45: 59.879: 
 ERROR/AndroidRuntime (9023): at 
 Android.widget.ListView.fillFromTop (ListView.Java:664) .__-06-06 21: 45: 59.879: 
 ERROR/AndroidRuntime (9023): at 
 Android.widget.ListView.layoutChildren (ListView.Java:1481) 
 05-06 21: 45: 59.879: 
 FEHLER/AndroidRuntime (9023): at 
 Android.widget.AbsListView.onLayout (AbsListView.Java:1113) 
 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): um 
 Android.widget.LinearLayout.setChildFrame (LinearLayout. Java: 1119) 
 05-06 21: 45: 59.879: 
 ERROR/AndroidRuntime (9023): at 
 Und roid.widget.LinearLayout.layoutVertical (LinearLayout.Java:998) 
 05-06 21: 45: 59.879: 
 ERROR/AndroidRuntime (9023): at 
 Android.widget.LinearLayout.onLayout (LinearLayout. Java: 918) 
 05-06 21: 45: 59.879: 
 FEHLER/Android-Laufzeit (9023): at 
 Android.view.View.layout (View.Java:6133) .__-06-06 21: 45: 59.879: 
 ERROR/AndroidRuntime (9023): at 
 Android.widget.FrameLayout.onLayout (FrameLayout.Java:333) 
 05-06 21: 45: 59.879: 
 FEHLER/AndroidRuntime (9023): um 
 Android.view.View.layout (View.Java:6133) 
 05-06 21: 45: 59.879: 
 FEHLER/AndroidRuntime (9023): um 
 Android.widget.LinearLayout.setChildFrame (LinearLayout.Java:1119) 
 05-06 21: 45: 59.879: 
 ERROR/AndroidRuntime (9023): um 
 Android.widget.LinearLayout.layoutVertical (LinearLayout. Java: 998) 
 05-06 21: 45: 59.879: 
 ERROR/AndroidRuntime (9023): at 
 Android.widget.LinearLayout.onLayout (LinearLayout.Java:918) .__-06-06 21: 45: 59.879: 
 ERROR/AndroidRuntime (9023): um 
 Android.view.View.layout (View.Jav a: 6133) 
 05-06 21: 45: 59.879: 
 ERROR/AndroidRuntime (9023): at 
 Android.widget.FrameLayout.onLayout (FrameLayout.Java:333) .__-06-06 21: 45: 59.879: 
 ERROR/AndroidRuntime (9023): um 
 Android.view.View.layout (View.Java:6133) 
 05-06 21: 45: 59.879: 
 FEHLER/AndroidRuntime (9023): um 
 Android.view.ViewRoot.performTraversals (ViewRoot.Java:929) 
 05-06 21: 45: 59.879: 
 ERROR/AndroidRuntime (9023): um 
 Android.view.ViewRoot.handleMessage (ViewRoot.Java:1482) 
 05-06 21: 45: 59.879: 
 ERROR/AndroidRuntime (9023): at 
 Android.os.Handler.dispatchMessage (Handler. Java: 99) 
 05-06 21: 45: 59.879: 
 ERROR/AndroidRuntime (9023): at 
 Android.os.Looper.loop (Looper.Java:123) .__-06-06 21: 45: 59.879: 
 ERROR/AndroidRuntime (9023): at 
 Android.app.ActivityThread.main (ActivityThread.Java:3948) 
 05-06 21: 45: 59.879: 
 ERROR/AndroidRuntime (9023): um 
 Java.lang.reflect.Method.invokeNative (Native 
 Methode) 05-06 21: 45: 59.879: 
 ERROR/AndroidRuntime (9023): at 
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.osyote.it.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: 
 FEHLER/AndroidRuntime (9023): Verursacht durch: 
 Java.lang.ClassCastException: 
 Android.widget.LinearLayout 05-06 
 21: 45: 59.879: 
ERROR/AndroidRuntime (9023): um 
 Android.widget.ArrayAdapter.createViewFromResource (ArrayAdapter.Java:340) 
 05-06 21: 45: 59.879: 
 ERROR/AndroidRuntime (9023): .. 30 
 Mehr

Meine Java-Datei:

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() {

//  }

}
`

Der Fehler ist hier:

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

Kein Fehler, wenn ich es entferne.

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

Was ist die Lösung bitte?

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

Ich bin mir ziemlich sicher, dass das Problem in Ihrem conversation_item-Layout liegt. Der docs state, den Sie einer Ressource mit einer single - TextView bereitstellen müssen. Wie sieht dieses Layout aus?

Zum Beispiel sieht das Layout von simple_list_item_1 so aus, dass Ihr Layout ziemlich ähnlich sein sollte.

<?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"
/>

EDIT:

Ich habe die Frage so bearbeitet, dass Ihr Layout angezeigt wird. Ihr Layout ist in der Tat falsch, Sie können das lineare Layout nicht dort haben, wenn Sie diesen Konstruktor verwenden. Sie können den anderen Konstruktor (ArrayAdapter(Context context, int resource, int textViewResourceId, T[] objects)) verwenden und Ihr benutzerdefiniertes Layout und Ihre TextView-ID angeben.

31
dmon

Hatte das gleiche Problem, musste den benutzerdefinierten Adapter von ändern:

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

zu:

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

Ich denke, die ausgewählte TextView wird verwendet, um die Rowid zu generieren, was ihre Notwendigkeit erklären kann, eindeutig zu sein.

27

Es ist besser, einen benutzerdefinierten Adapter zu verwenden, wenn ein Array von Objekten in einer benutzerdefinierten Layoutansicht aufgeführt werden muss. Diese einfache und schöne Referenz finden Sie hier Eine Listenansicht mit einem benutzerdefinierten Adapter füllen

1
randomness

Der Konstruktor, den Sie verwenden, ist ausschließlich für eine CheckedTextView. Das Problem entsteht dadurch, dass Sie in Ihrer XML-Datei auch ein lineares Layout angeben. Die einfachste Lösung besteht darin, das lineare Layout zu entfernen und nur die CheckedTextView beizubehalten. Prost!

0
Ketan Dubey