您必须为TextView安全系统错误提供资源ID

我这一天都在尝试解决这个错误。 我不明白为什么我的logcat打印:

  05-06 21:45:59.559:
 ERROR / ConversationList(9023):我们有
聊天... 05-06 21:45:59.609:
 ERROR / ConversationList(9023):
 UpdateList结束... 05-06 21:45:59.839:
 ERROR / ArrayAdapter(9023):你必须
提供TextView的资源ID
 05-06 21:45:59.839:
 DEBUG / AndroidRuntime(9023):关闭
 VM 05-06 21:45:59.839:
 WARN / dalvikvm(9023):threadid = 3:
线程退出与未捕获的exception
 (组= 0x4000fe70)05-06 21:45:59.839:
错误/ AndroidRuntime(9023):未捕获
 handler:由于线程主要退出
未被捕的例外05-06 21:45:59.879:
 ERROR / AndroidRuntime(9023):
 java.lang.IllegalStateException:
 ArrayAdapter需要资源ID
成为TextView 05-06 21:45:59.879:
错误/ AndroidRuntime(9023):at
 android.widget.ArrayAdapter.createViewFromResource(ArrayAdapter.java:347)
 05-06 21:45:59.879:
错误/ AndroidRuntime(9023):at
 android.widget.ArrayAdapter.getView(ArrayAdapter.java:323)
 05-06 21:45:59.879:
错误/ AndroidRuntime(9023):at
 android.widget.AbsListView.obtainView(AbsListView.java:1269)
 05-06 21:45:59.879:
错误/ AndroidRuntime(9023):at
 android.widget.ListView.makeAndAddView(ListView.java:1623)
 05-06 21:45:59.879:
错误/ AndroidRuntime(9023):at
 android.widget.ListView.fillDown(ListView.java:607)
 05-06 21:45:59.879:
错误/ AndroidRuntime(9023):at
 android.widget.ListView.fillFromTop(ListView.java:664)
 05-06 21:45:59.879:
错误/ AndroidRuntime(9023):at
 android.widget.ListView.layoutChildren(ListView.java:1481)
 05-06 21:45:59.879:
错误/ AndroidRuntime(9023):at
 android.widget.AbsListView.onLayout(AbsListView.java:1113)
 05-06 21:45:59.879:
错误/ AndroidRuntime(9023):at
 android.view.View.layout(View.java:6133)
 05-06 21:45:59.879:
错误/ AndroidRuntime(9023):at
 android.widget.LinearLayout.setChildFrame(LinearLayout.java:1119)
 05-06 21:45:59.879:
错误/ AndroidRuntime(9023):at
 android.widget.LinearLayout.layoutVertical(LinearLayout.java:998)
 05-06 21:45:59.879:
错误/ AndroidRuntime(9023):at
 android.widget.LinearLayout.onLayout(LinearLayout.java:918)
 05-06 21:45:59.879:
错误/ AndroidRuntime(9023):at
 android.view.View.layout(View.java:6133)
 05-06 21:45:59.879:
错误/ AndroidRuntime(9023):at
 android.widget.FrameLayout.onLayout(FrameLayout.java:333)
 05-06 21:45:59.879:
错误/ AndroidRuntime(9023):at
 android.view.View.layout(View.java:6133)
 05-06 21:45:59.879:
错误/ AndroidRuntime(9023):at
 android.widget.LinearLayout.setChildFrame(LinearLayout.java:1119)
 05-06 21:45:59.879:
错误/ AndroidRuntime(9023):at
 android.widget.LinearLayout.layoutVertical(LinearLayout.java:998)
 05-06 21:45:59.879:
错误/ AndroidRuntime(9023):at
 android.widget.LinearLayout.onLayout(LinearLayout.java:918)
 05-06 21:45:59.879:
错误/ AndroidRuntime(9023):at
 android.view.View.layout(View.java:6133)
 05-06 21:45:59.879:
错误/ AndroidRuntime(9023):at
 android.widget.FrameLayout.onLayout(FrameLayout.java:333)
 05-06 21:45:59.879:
错误/ AndroidRuntime(9023):at
 android.view.View.layout(View.java:6133)
 05-06 21:45:59.879:
错误/ AndroidRuntime(9023):at
 android.view.ViewRoot.performTraversals(ViewRoot.java:929)
 05-06 21:45:59.879:
错误/ AndroidRuntime(9023):at
 android.view.ViewRoot.handleMessage(ViewRoot.java:1482)
 05-06 21:45:59.879:
错误/ AndroidRuntime(9023):at
 android.os.Handler.dispatchMessage(Handler.java:99)
 05-06 21:45:59.879:
错误/ AndroidRuntime(9023):at
 android.os.Looper.loop(Looper.java:123)
 05-06 21:45:59.879:
错误/ AndroidRuntime(9023):at
 android.app.ActivityThread.main(ActivityThread.java:3948)
 05-06 21:45:59.879:
错误/ AndroidRuntime(9023):at
 java.lang.reflect.Method.invokeNative(母语
方法)05-06 21:45:59.879:
错误/ AndroidRuntime(9023):at
 java.lang.reflect.Method.invoke(Method.java:521)
 05-06 21:45:59.879:
错误/ AndroidRuntime(9023):at
 com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:782)
 05-06 21:45:59.879:
错误/ AndroidRuntime(9023):at
 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:540)
 05-06 21:45:59.879:
错误/ AndroidRuntime(9023):at
 dalvik.system.NativeStart.main(母语
方法)05-06 21:45:59.879:
错误/ AndroidRuntime(9023):引起:
 java.lang.ClassCastException:
 android.widget.LinearLayout 05-06
 21:45:59.879:
错误/ AndroidRuntime(9023):at
 android.widget.ArrayAdapter.createViewFromResource(ArrayAdapter.java:340)
 05-06 21:45:59.879:
错误/ AndroidRuntime(9023):... 30
更多 

我的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 chatList = new ArrayList(); 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("rafa@localhost.localdomain"); 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( this, R.layout.conversation_item, chatList ); getListView().setAdapter(adapter); //startChat("rafa@localhost.localdomain"); // 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( this, R.layout.conversation_item, chatList ); getListView().setAdapter(adapter); 

删除它时没有错误。

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

请问有什么解决方案?

conversation_item.xml

          

我很确定问题出在你的conversation_item布局中。 文档声明您必须使用单个 TextView提供资源。 这种布局是什么样的?

作为一个例子,这就是simple_list_item_1布局的样子,你的布局应该非常相似。

 < ?xml version="1.0" encoding="utf-8"?>  

编辑:

我刚编辑了这个问题,所以你的布局会显示出来。 您的布局确实是错误的,如果您正在使用该构造函数,则不能在那里使用线性布局。 您可以使用其他构造函数( ArrayAdapter(Context context, int resource, int textViewResourceId, T[] objects) )并提供自定义布局和TextView的id。

有同样的问题,需要更改自定义适配器:

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

至:

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

我认为所选的TextView将用于生成rowid,这可能解释了它需要是唯一的,但我还不确定。

每当需要在自定义布局视图中列出对象数组时,最好使用自定义适配器。 请参阅这个简单而美观的参考资料使用自定义适配器填充列表视图

您使用的构造函数严格来说是CheckedTextView。 由于您还在xml文件中提供线性布局,因此出现问题。 最简单的解决方案是删除线性布局并仅保留CheckedTextView。 干杯!