Android ListView avec RadioButton dans singleChoice mode et une ligne personnalisée mise en page
J'ai un ListView, qui est en singleChoice mode. Tout ce que je veux c'est afficher un bouton radio à côté, que lorsque l'utilisateur clique dessus met en évidence à dire qu'il est sélectionné, et quand un autre est cliqué que l'on remonte pas sélectionné et que le nouveau est sélectionnée. Pourquoi est-ce si difficile? Cela ne devrait pas être si compliqué. J'ai passé JOURS à la recherche d'une réponse à cela et je n'ai rien trouvé, donc je demande, nous l'espérons, dans un style clair et concis.
Ma mise en page pour la liste de (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 ligne personnalisée (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, tout sous-jacente fonctionne comme prévu, vous cliquez sur un bouton radio et à travers elle de la balise, je peux bien sélectionner cet élément de la liste et de le manipuler comme je veux. Toutefois, lorsque le premier bouton radio est sélectionné, le dernier sera sélectionné. Cliquez sur le même bouton radio fois, et il est maintenant sélectionnée. Cliquez sur une fois de plus et rien ne se passe, à la fois le dernier et le premier sont sélectionnés. Maintenant, je clique sur n'importe quel autre sur la liste, il est sélectionné comme prévu. Cliquez sur quelqu'un de la radio choisie boutons et rien ne se passe, le bouton radio reste sélectionné.
J'ai essayé d'utiliser les éléments suivants 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 juste pas de boutons radio à tous. GÉNIAL.
Maintenant peut-être (lire: le plus probable), je suis juste dense et ne peut pas comprendre cela, mais j'ai vu cette question posée beaucoup avec pas de vraie réponse. Beaucoup de références à d'autres tutoriels ou à la Commonsware gars du livre. Cependant, les commentaires sont vieux maintenant, et son référentiel a tellement changé, que ceux qui ne sont pas plus de réponses correctes.
Donc, quelqu'un a une idée de comment obtenir la fonctionnalité attendue de sortir de cette situation? Ou, à défaut, juste me passer le long de l'application GMail est le code source. 🙂
Vous devez vous connecter pour publier un commentaire.
Ne garder à l'esprit que, dans la ListView ligne les éléments sont RECYCLÉS. C'est probablement expliquer pourquoi des actions sur une ligne sont en affecter un autre. Creuser autour de Marc livre et vous trouverez la couverture de ce.
Si vous utilisez un adaptateur avec la liste, vous pouvez utiliser getView() sur un adaptateur pour ajouter un gestionnaire d'événements click pour chaque ligne comme il a été créé/recyclé, et assurez-vous que l'état est géré correctement, que la rangée d'éléments créés et recyclés.
Mon approche est de stocker de l'état dans ma propre structure de données, et ensuite utiliser getView() pour miroir dans l'INTERFACE utilisateur que l'utilisateur fait défiler en haut et en bas de la liste. Il peut y avoir une meilleure solution, mais cela fonctionne pour moi.
Solution Simple:
Ajouter cette ligne dans la case d'option de mise en page de votre fichier xml:
Puis dans la classe d'activité qui utilise la liste, ajoutez la ligne suivante:
Avec ce simple code une seule case d'option est cochée.
Si vous touchez l'un qui est déjà coché, puis il retourne à la case décochée mode.
"listIndex" est suivi de l'élément coché, -1 si aucun.
Si vous voulez garder toujours un cochée, alors le code dans onClickRadioButton devrait être:
Mon Nom Est Gourab Singha. J'ai résolu Ce Problème. J'ai Écrit Ce Code pour le résoudre. J'espère que cela vous aide à vous tous. Merci. J'ai besoin de 3 heures pour la.
XML:
J'ai juste eu un problème similaire. Il semblait qu'elle était liée à la vue de son recyclage. Mais j'ai ajouté du Journal partout et a remarqué que le recyclage de la manipulation était très bien.
Le problème était de la manipulation de composants radiobutton. J'ai été en utilisant:
et la bonne façon de le faire est:
Vous pouvez faire beaucoup plus simple, suivez ce. Il a été essayé dans la Guimauve
1)Ont un
CheckedTextView
:ListChoiceIndicatorSingle
afficheRadioButton
.ListChoiceIndicatorMultiple
afficheCheckBox
N'oublie pas de mettre
choiceMode:Single
dans votreListView
.À l'intérieur de l'adaptateur
ajouter du style du bouton radio
et dans le xml utilisez le bouton radio style
Sur votre carte:
Sur votre activité/fragment: