2011-01-11 10 views
12

Oye, estoy intentando crear un diseño para una lista que se parece (y se comporta principalmente) al registro de llamadas, como se muestra aquí:

alt text

para ello he descargado el código fuente y estoy estudiando para saber qué clase y archivo XML implementan.

Y me encontré con este dos archivos XML recent_calls_list_item.xml:

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="match_parent" android:layout_height="?android:attr/listPreferredItemHeight" 
android:paddingLeft="7dip"> 

<com.psyhclo.DontPressWithParentImageView 
    android:id="@+id/call_icon" android:layout_width="wrap_content" 
    android:layout_height="match_parent" android:paddingLeft="14dip" 
    android:paddingRight="14dip" android:layout_alignParentRight="true" 

    android:gravity="center_vertical" android:src="@android:drawable/sym_action_call" 
    android:background="@drawable/call_background" /> 

<include layout="@layout/recent_calls_list_item_layout" /> 

y el otro es recent_calls_list_item_layout.xml:

<?xml version="1.0" encoding="utf-8"?> 
<merge xmlns:android="http://schemas.android.com/apk/res/android"> 

<View android:id="@+id/divider" 
    android:layout_width="1px" 
    android:layout_height="match_parent" 
    android:layout_marginTop="5dip" 
    android:layout_marginBottom="5dip" 
    android:layout_toLeftOf="@id/call_icon" 
    android:layout_marginLeft="11dip" 
    android:background="@drawable/divider_vertical_dark" 
/> 

<ImageView android:id="@+id/call_type_icon" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_alignParentTop="true" 
    android:layout_alignParentLeft="true" 
    android:layout_marginLeft="4dip" 
/> 

<TextView android:id="@+id/date" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_toLeftOf="@id/divider" 
    android:layout_alignParentBottom="true" 
    android:layout_marginBottom="8dip" 
    android:layout_marginLeft="10dip" 

    android:textAppearance="?android:attr/textAppearanceSmall" 
    android:singleLine="true" 
/> 

<TextView android:id="@+id/label" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_alignParentLeft="true" 
    android:layout_alignParentBottom="true" 
    android:layout_marginLeft="36dip" 
    android:layout_marginRight="5dip" 
    android:layout_alignBaseline="@id/date" 

    android:singleLine="true" 
    android:ellipsize="marquee" 
    android:textAppearance="?android:attr/textAppearanceSmall" 
    android:textStyle="bold" 
/> 

<TextView android:id="@+id/number" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_toRightOf="@id/label" 
    android:layout_toLeftOf="@id/date" 
    android:layout_alignBaseline="@id/label" 
    android:layout_alignWithParentIfMissing="true" 

    android:singleLine="true" 
    android:ellipsize="marquee" 
    android:textAppearance="?android:attr/textAppearanceSmall" 
/> 

<TextView android:id="@+id/line1" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_alignParentLeft="true" 
    android:layout_alignParentTop="true" 
    android:layout_toLeftOf="@id/divider" 
    android:layout_above="@id/date" 
    android:layout_alignWithParentIfMissing="true" 
    android:layout_marginLeft="36dip" 
    android:layout_marginBottom="-10dip" 

    android:textAppearance="?android:attr/textAppearanceLarge" 
    android:singleLine="true" 
    android:ellipsize="marquee" 
    android:gravity="center_vertical" 
/> 

Y mi actividad es la siguiente:

public class RatedCalls extends ListActivity { 

private static final String LOG_TAG = "RecentCallsList"; 
private TableLayout table; 
private CallDataHelper cdh; 
private TableRow row; 
private TableRow row2; 

public void onCreate(Bundle savedInstanceState) { 

    super.onCreate(savedInstanceState); 
    setContentView(R.layout.recent_calls_list_item); 
    Log.i(LOG_TAG, "calling from onCreate()"); 

    cdh = new CallDataHelper(this); 
    table = new TableLayout(getApplicationContext()); 
    row = new TableRow(getApplicationContext()); 

    startService(new Intent(this, RatedCallsService.class)); 
    Log.i(LOG_TAG, "Service called."); 
    fillList(); 

} 

public void onResume() { 

    super.onResume(); 
    fillList(); 

} 

public void fillList() { 

    List<String> ratedCalls = new ArrayList<String>(); 
    ratedCalls = this.cdh.selectTopCalls(); 

    setListAdapter(new ArrayAdapter<String>(RatedCalls.this, 
      android.R.id.list, ratedCalls)); 

    ListView lv = getListView(); 
    lv.setTextFilterEnabled(true); 

    lv.setOnItemClickListener(new OnItemClickListener() { 
     public void onItemClick(AdapterView<?> parent, View view, 
       int position, long id) { 

      Toast.makeText(getApplicationContext(), 
        ((TextView) view).getText(), Toast.LENGTH_LONG).show(); 
     } 
    }); 

} 

}

Y luego traté de ejecutarlo en el emulador de Android, y luego se la LogCat devuelve un error como este:

Caused by: java.lang.RuntimeException: Your content must have a ListView whose id attribute is 'android.R.id.list'

Así que dentro de la recent_calls_list_item.xml declaré esto:

<ListView android:id="@android:id/list" android:layout_width="wrap_content" 
    android:layout_height="wrap_content" android:layout_x="1px" 
    android:layout_y="1px"> 
</ListView> 

Y ahora con esta declararon Traté de correr en el emulador, pero el LogCat devuelve otro error:

android.content.res.Resources$NotFoundException: File from xml type layout resource ID #0x102000a

lo tanto, mi pregunta es, ¿por qué sucede esto? Y si tienes otra solución para implementar una vista como esta lo estoy intentando.

Gracias.

Respuesta

3

ajustar el ID de su Listview a

android:id="@id/android:list" 

No sé, si

android:id="@android:id/list" 

Cómo funciona correctamente

7

Suena cojo, pero si usted está usando Eclipse, ¿ha tratado de limpieza y reconstruyendo tu proyecto? Eso solucionó un problema similar que estaba teniendo.

97

Tuve el mismo problema. Yo estaba sentado el texto como este:

statusView.setText(firstVisiblePosition); 

El problema era que firstVisiblePosition era un entero. El compilador no se quejó.Corregido por

statusView.setText(""+firstVisiblePosition); 
+1

gracias tuve el mismo problema exacto. Encuentro la excepción realmente mala, nada realmente indica el error. – pdiddy

+0

¡Este también me funciona! +1 – Jomoos

+3

Genial, debería ser la respuesta aceptada. – Derek

6

También soy capaz de resolver el problema convirtiendo el valor entero en cadena durante el uso:

name.setText(name_value_needs_to_be_string); 

donde nombre es un TextView.

4

El compilador interpreta el argumento int como una referencia de recursos y asume que está llamando:

public final void setText (int resourceId) 

pero su intención fue llamar

public final void setText (CharSequence text) 

Para solucionarlo, hacerlo de esta manera:

myTextView.setText(Integer.toString(myIntegerValue)); 
0

He resuelto este problema copiando el archivo XML de layout-land directorio a layout (o viceversa). Algunos dispositivos tienen modo de paisaje predeterminado, otros retrato. Si ese archivo no existe en ese modo, arroja esta excepción.

Cuestiones relacionadas