J'ai un ListView, qui est en singleChoice mode. Tout ce que je veux, c'est afficher un RadioButton sur le côté, que lorsque l'on clique sur les faits saillants pour dire qu'il est sélectionné, et que l'on clique sur un bouton différent, on retourne à non sélectionné et le nouveau devient sélectionné. Pourquoi est-ce si difficile? Cela ne devrait pas être si compliqué. J'ai passé jours à la recherche d'une réponse appropriée à cela et je n'ai rien trouvé, donc je demande avec optimisme d'une manière claire et concise.Android ListView avec RadioButton en mode singleChoice et une disposition de ligne personnalisée
Ma mise en page pour la listview (R.layout.view_orders):
<?xml version="1.0" encoding="utf-8"?>
<ListView
android:choiceMode="singleChoice"
android:id="@android:id/list"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:divider="@drawable/list_divider"
android:dividerHeight="1px"
android:focusable="false"
android:focusableInTouchMode="false"
android:cacheColorHint="#00000000">
</ListView>
Ma coutume ligne (R.layout.orders_row):
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:app="http://schemas.android.com/apk/res/com.xxx.xxxxxx"
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:padding="6dip">
<com.xxx.xxxxxx.VerticalLabelView
app:text="SHORT"
app:textColor="#666"
app:textSize="14sp"
android:id="@+id/state"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_centerVertical="true" />
<TextView
android:id="@+id/quantity"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_toRightOf="@id/state"
android:layout_centerVertical="true"
android:gravity="center"
android:textSize="40sp"
android:layout_margin="2dip"
android:minWidth="30dip"
android:textColor="#555" />
<RelativeLayout
android:layout_toRightOf="@id/quantity"
android:layout_centerVertical="true"
android:layout_width="fill_parent"
android:layout_height="wrap_content">
<TextView
android:id="@+id/instrument"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:textSize="20sp"
android:textColor="#333"
android:layout_marginLeft="2dip"
android:layout_marginRight="2dip"
/>
<TextView
android:id="@+id/deets"
android:layout_below="@id/instrument"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:textSize="16sp"
android:textColor="#888"
android:layout_marginLeft="2dip"
android:layout_marginRight="2dip"
/>
</RelativeLayout>
<RadioButton
android:id="@+id/selector"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:layout_centerVertical="true"
/>
</RelativeLayout>
Mon onCreate () méthode:
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.view_orders);
client = new Client(handler);
ola = new OrdersAdapter(this, R.layout.orders_row, Orders);
setListAdapter(ola);
final RelativeLayout loading = (RelativeLayout) findViewById(R.id.loading);
panel = (PositionsPanel) findViewById(R.id.panel);
Utility.showProgressBar(loading);
client.Connect("orders");
}
Maintenant que tout sous-jacent fonctionne comme prévu, vous cliquez sur un radiobutton et grâce à son tag, je peux sélectionner cet élément de la liste et le manipuler comme je le souhaite. Cependant, lorsque le premier bouton radio est cliqué, le dernier sera sélectionné. Cliquez à nouveau sur ce même bouton radio et il est maintenant sélectionné. Cliquez encore une fois et rien ne se passe, le dernier et le premier sont sélectionnés. Maintenant, je clique sur un autre sur la liste, il est sélectionné comme prévu. Cliquez sur l'un des boutons radio sélectionnés et rien ne se passe, le bouton radio reste sélectionné.
J'ai essayé d'utiliser ce qui suit dans onCreate():
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.view_orders);
client = new Client(handler);
ola = new OrdersAdapter(this, android.R.layout.simple_list_item_single_choice, Orders);
setListAdapter(ola);
final RelativeLayout loading = (RelativeLayout) findViewById(R.id.loading);
panel = (PositionsPanel) findViewById(R.id.panel);
Utility.showProgressBar(loading);
client.Connect("orders");
}
et qui montre tout simplement pas les boutons radio du tout. IMPRESSIONNELLE.
Maintenant peut-être (lire: très probablement), je suis juste dense et ne peux pas comprendre cela, mais j'ai vu cette question posée beaucoup avec aucune vraie réponse. Beaucoup de références à d'autres tutoriels ou au livre du gars Commonsware. Cependant, les commentaires sont vieux maintenant et son référentiel a tellement changé, que ce ne sont plus des réponses correctes.
Alors, est-ce que quelqu'un a une idée de la façon d'obtenir les fonctionnalités attendues? Ou à défaut, il suffit de me passer le code source de l'application GMail. :)
Donc c'est exactement ce qui se passe. Je ne sais pas pourquoi aucune des autres réponses n'a pas simplement énoncé ce simple fait. Après avoir réalisé que j'utilisais un convertView et que je le recyclais, c'était vraiment évident. Une minute ou deux de googling et je sais comment résoudre ceci. J'ai regardé dans le livre de Mark, Chapitre 9, "Getting Fancy With Lists" et son exemple de RateList est détaillé ici, ce qui l'explique assez clairement. Toute personne ayant ce problème vérifier ce chapitre de Beginning Android par Mark Murphy. –
Ces types de bizarreries dans Android en font une courbe d'apprentissage abrupte, mais une fois compris, nous obtenons les avantages de performance du recyclage. –
Alors ça n'a pas fonctionné, je l'ai parcouru et, bien que le recyclage soit la raison de ce que je vois, le livre de Mark ne détaille pas comment résoudre le problème que je rencontre. –