Подтвердить что ты не робот

Вы должны указать идентификатор ресурса для ошибки TextView android

Я пробую весь этот день решить эту ошибку. Я не понимаю, почему мои логарифмические отпечатки:

05-06 21:45:59.559:
ERROR/ConversationList(9023): We have
chats... 05-06 21:45:59.609:
ERROR/ConversationList(9023):
UpdateList end... 05-06 21:45:59.839:
ERROR/ArrayAdapter(9023): You must
supply a resource ID for a TextView
05-06 21:45:59.839:
DEBUG/AndroidRuntime(9023): Shutting
down VM 05-06 21:45:59.839:
WARN/dalvikvm(9023): threadid=3:
thread exiting with uncaught exception
(group=0x4000fe70) 05-06 21:45:59.839:
ERROR/AndroidRuntime(9023): Uncaught
handler: thread main exiting due to
uncaught exception 05-06 21:45:59.879:
ERROR/AndroidRuntime(9023):
java.lang.IllegalStateException:
ArrayAdapter requires the resource ID
to be a 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:
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):     at
android.widget.ListView.fillDown(ListView.java:607)
05-06 21:45:59.879:
ERROR/AndroidRuntime(9023):     at
android.widget.ListView.fillFromTop(ListView.java:664)
05-06 21:45:59.879:
ERROR/AndroidRuntime(9023):     at
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):     at
android.view.View.layout(View.java:6133)
05-06 21:45:59.879:
ERROR/AndroidRuntime(9023):     at
android.widget.LinearLayout.setChildFrame(LinearLayout.java:1119)
05-06 21:45:59.879:
ERROR/AndroidRuntime(9023):     at
android.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:
ERROR/AndroidRuntime(9023):     at
android.view.View.layout(View.java:6133)
05-06 21:45:59.879:
ERROR/AndroidRuntime(9023):     at
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):     at
android.widget.LinearLayout.setChildFrame(LinearLayout.java:1119)
05-06 21:45:59.879:
ERROR/AndroidRuntime(9023):     at
android.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:
ERROR/AndroidRuntime(9023):     at
android.view.View.layout(View.java:6133)
05-06 21:45:59.879:
ERROR/AndroidRuntime(9023):     at
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):     at
android.view.ViewRoot.performTraversals(ViewRoot.java:929)
05-06 21:45:59.879:
ERROR/AndroidRuntime(9023):     at
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)
05-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):     at
java.lang.reflect.Method.invokeNative(Native
Method) 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.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): Caused by:
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
more

Мой файл 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() {

//  }

}
`

Ошибка здесь:

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

Ошибка при удалении.

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

Какое решение вам нужно?

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>
4b9b3361

Ответ 1

Я уверен, что проблема заключается в вашем макете conversation_item. В docs указано, что вы должны предоставить ресурс с помощью одиночного TextView. Как выглядит этот макет?

В качестве примера, вот как выглядит макет simple_list_item_1, ваш должен быть очень похожим.

<?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:

Я только что редактировал вопрос, чтобы ваш макет отображался. Ваш макет действительно неправильный, вы не можете иметь линейный макет там, если используете этот конструктор. Вы можете использовать другой конструктор (ArrayAdapter(Context context, int resource, int textViewResourceId, T[] objects)) и предоставить свой собственный макет и свой идентификатор TextView.

Ответ 2

Была та же проблема, что и для изменения пользовательского адаптера:

  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);

Я думаю, что выбранный TextView будет использоваться для генерации rowid, что может объяснить его необходимость быть уникальным, но я еще не уверен.

Ответ 4

Используемый конструктор предназначен для строго CheckedTextView. Проблема возникает из-за того, что вы также предоставляете линейный макет в вашем XML файле. Наиболее простым решением является удаление линейного макета и сохранение только CheckedTextView. Ура!