studio programacion móviles formularios formulario diseño dinamicos desarrollo curso aplicaciones android arrays resources textview

programacion - Debe proporcionar un ID de recurso para un error de TextView en Android



manual de programacion android pdf (4)

Intento todo este día para resolver este error. No entiendo por qué mi logcat imprime:

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

Mi archivo 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() { // } } `

El error está aquí:

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

No hay error cuando lo elimino.

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

¿Cuál es la solución por favor?

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>


El constructor que está utilizando es estrictamente para un CheckedTextView. El problema surge debido a que también proporciona un diseño lineal en su archivo xml. La solución más simple es eliminar el diseño lineal y mantener solo el CheckedTextView. ¡Aclamaciones!



Estoy bastante seguro de que el problema radica en el diseño de su conversation_item . Los docs indican que debe proporcionar un recurso con un solo TextView. ¿Qué aspecto tiene ese diseño?

Como ejemplo, este es el aspecto del diseño simple_list_item_1, el tuyo debería ser bastante similar.

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

EDITAR:

Acabo de editar la pregunta para que se vea su diseño. Su diseño es realmente incorrecto, no puede tener el diseño lineal allí si está utilizando ese constructor. Puede usar el otro constructor ( ArrayAdapter(Context context, int resource, int textViewResourceId, T[] objects) ) y proporcionar su diseño personalizado y su ID de TextView.


Tenía el mismo problema, necesitaba cambiar el adaptador personalizado de:

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

a:

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

Creo que el TextView seleccionado se utilizará para generar el rowid, lo que puede explicar su necesidad de ser único, pero aún no estoy seguro.