Hé, j'essaye de créer un design pour une liste qui ressemble (et se comporte généralement comme) au journal des appels, comme illustré ici:
Pour cela, j'ai téléchargé le code source et je l'étudie pour savoir quelle classe et quel fichier xml l'implémenter.
Et j'ai trouvé ces deux fichiers 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" />
et l'autre est 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"
/>
Et mon activité est la suivante:
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();
}
});
}
}
Et puis j'ai essayé de l'exécuter sur l'émulateur Android, puis LogCat a renvoyé une erreur comme celle-ci:
Causée par: Java.lang.RuntimeException: votre contenu doit avoir un ListView dont l'attribut id est 'Android.R.id.list'.
Donc, à l'intérieur du recent_calls_list_item.xml j'ai déclaré ceci:
<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>
Et maintenant, avec ceci déclaré, j'ai essayé de fonctionner dans l'émulateur, mais le LogCat renvoie une autre erreur:
Android.content.res.Resources $ NotFoundException: fichier à partir de l'ID de ressource de mise en page de type x # 0x102000a
Alors, ma question est la suivante: pourquoi cela se produit-il? Et si vous avez une autre solution pour implémenter une vue comme celle-ci, j'essaie.
Merci.
définissez l'identifiant de votre liste sur
Android:id="@id/Android:list"
Je ne sais pas si
Android:id="@Android:id/list"
fonctionne correctement
J'ai eu le même problème. Je mettais le texte comme ceci:
statusView.setText(firstVisiblePosition);
Le problème était que firstVisiblePosition était un entier. Le compilateur ne s'est pas plaint. Fixé par
statusView.setText(""+firstVisiblePosition);
Cela semble nul, mais si vous utilisez Eclipse, avez-vous essayé de nettoyer et de reconstruire votre projet? Cela a résolu un problème similaire que j'avais.
Je suis également capable de résoudre le problème en convertissant la valeur Integer en String en utilisant:
name.setText(name_value_needs_to_be_string);
où nom est un TextView.
Le compilateur interprète votre argument int
comme une référence de ressource et suppose que vous appelez:
public final void setText (int resourceId)
mais votre intention était d'appeler
public final void setText (CharSequence text)
Pour le réparer, faites comme ça:
myTextView.setText(Integer.toString(myIntegerValue));
J'ai résolu ce problème en copiant le fichier XML du répertoire layout-land
dans layout
(ou vice versa). Certains appareils ont le mode paysage par défaut, d'autres portrait. Si ce fichier n'existe pas dans ce mode, il lève cette exception.