2011-01-11 13 views
12

Ehi, sto provando a creare un disegno per un elenco che assomiglia (e per lo più si comporta come) al registro delle chiamate, come mostrato qui:

alt text

per questo ho scaricato il codice sorgente e sto studiando per sapere quale classe e file xml attuarlo.

e ho trovato questo due file 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" /> 

e l'altro è 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" 
/> 

E la mia attività è questo:

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

} 

}

E poi ho cercato di eseguirlo sul emulatore di Android, e poi la LogCat ha restituito un errore come questo:

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

Quindi all'interno del recent_calls_list_item.xml ho dichiarato questo:

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

E ora con questo dichiarata ho provato a correre nell'emulatore, ma il LogCat restituisce un altro errore:

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

Quindi, la mia domanda è, perché sta succedendo questo? E se hai un'altra soluzione per implementare una vista come questa, ci sto provando.

Grazie.

risposta

3

impostare l'ID del tuo listView per

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

Non so, se

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

funziona correttamente

7

Suona zoppo, ma se si utilizza Eclipse, hai provato la pulizia e ricostruire il tuo progetto? Questo ha risolto un problema simile che stavo avendo.

97

Ho avuto lo stesso problema. Stavo impostando il testo come questo:

statusView.setText(firstVisiblePosition); 

Il problema era che firstVisiblePosition era un numero intero. Il compilatore non si è lamentato.Risolto facendo

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

grazie ho avuto lo stesso esatto problema. Trovo l'eccezione davvero pessima, nulla indica realmente l'errore. – pdiddy

+0

Questo funziona anche per me !!! +1 – Jomoos

+3

Grande, dovrebbe essere la risposta accettata. – Derek

6

Sono anche in grado di risolvere il problema convertendo il valore intero a stringa durante l'utilizzo:

name.setText(name_value_needs_to_be_string); 

cui nome è un TextView.

4

Il compilatore interpreta la vostra discussione int come riferimento risorsa e si presuppone che si sta chiamando:

public final void setText (int resourceId) 

ma la vostra intenzione era quella di chiamare

public final void setText (CharSequence text) 

Per risolvere il problema, farlo in questo modo:

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

Ho risolto questo problema copiando il file XML daDirectorya layout (o viceversa). Alcuni dispositivi hanno la modalità orizzontale di default, altri sono ritratti. Se quel file non esiste in quella modalità, genera questa eccezione.

Problemi correlati