2011-01-11 4 views
12

Hey, ich versuche, ein Design für eine Liste zu erstellen, die wie aussieht aussieht (und verhält sich meistens) wie das Anrufprotokoll gezeigt hier:

alt text

Dazu heruntergeladen ich den Quellcode und ich studiere es wissen, was Klasse und xML-Datei es implementieren.

Und ich fand diese zwei XML-Dateien 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" /> 

und das andere ist 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" 
/> 

Und meine Tätigkeit ist dies:

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

} 

}

Und dann habe ich versucht, es auf dem Android-Emulator laufen zu lassen und es die LogCat einen Fehler zurückgegeben, wie dies dann:

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

so in der recent_calls_list_item.xml ich erklärte dies:

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

Und jetzt mit dieser erklärt habe ich versucht, in dem Emulator zu laufen, aber die LogCat gibt einen anderen Fehler:

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

Also, meine Frage ist, warum ist das passiert? Und wenn Sie eine andere Lösung haben, um eine Ansicht wie diese zu implementieren, versuche ich es.

Danke.

Antwort

3

stellen Sie die ID Ihrer Listview

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

Ich weiß nicht, ob

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

richtig

lahm
7

Sounds funktioniert, aber wenn Sie von Eclipse verwenden, haben Sie versucht, Reinigung und dein Projekt neu aufbauen? Das behob ein ähnliches Problem, das ich hatte.

97

Ich hatte das gleiche Problem. Ich war die Einstellung der Text wie folgt aus:

statusView.setText(firstVisiblePosition); 

Das Problem war, dass firstVisiblePosition eine ganze Zahl ist. Compiler hat sich nicht beschweren.Feste durch

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

danke ich hatte das gleiche genaue Problem. Ich finde die Ausnahme sehr schlecht, nichts deutet auf den Fehler hin. – pdiddy

+0

Dieser funktioniert auch für mich !!! +1 – Jomoos

+3

Großartig, sollte die akzeptierte Antwort sein. – Derek

6

Ich bin auch in der Lage, das Problem zu lösen, indem Sie den Integer-Wert String Umwandlung bei der Verwendung von:

name.setText(name_value_needs_to_be_string); 

wo Name ein Textview ist.

4

Der Compiler interpretiert Ihre int Argument als Ressource-Referenz-und vorausgesetzt, dass Sie anrufen:

public final void setText (int resourceId) 

aber Ihre Absicht

public final void setText (CharSequence text) 

zu nennen war, es zu beheben, gehen Sie wie folgt:

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

Ich löste dieses Problem durch Kopieren der XML-Datei von layout-land Verzeichnis zu layout (oder umgekehrt). Einige Geräte haben einen Standard-Landschaftsmodus, andere ein Porträt. Wenn diese Datei in diesem Modus nicht existiert, wird diese Ausnahme ausgelöst.