Je veux créer une vue de liste personnalisée avec deux TextViews et un bouton radio sur une seule ligne. Et sur listitem, cliquez sur l'état du bouton radio. Je ne peux pas utiliser Simple Adapter ici.
J'ai déjà posé cette question Mise en page personnalisée à choix unique de ListView mais je ne trouve aucune solution satisfaisante.
Ce que je fais actuellement, c'est que j'utilise simple_list_item_single_choice et que je place les données des deux TextViews dans une seule, séparée par des espaces blancs. Mais ici, cela empire (montré dans l'image ci-dessous).
Ce que je veux, c'est fixer l'emplacement de la taille et du prix et faire de la liste un choix unique.
La disposition XML de la liste peut ressembler à ceci:
**<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:id="@+id/layout"
Android:layout_width="fill_parent"
Android:layout_height="wrap_content"
Android:gravity="center_horizontal"
Android:orientation="horizontal" >
<TextView
Android:id="@+id/tv_size"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:text="TextView"
Android:textSize="15sp"
Android:width="200dp" />
<TextView
Android:id="@+id/tv_price"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:text="TextView"
Android:textSize="15sp"
Android:width="70dp" />
<RadioButton
Android:id="@+id/radioButton"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content" />
</LinearLayout>**
Comment faire un adaptateur personnalisé pour cela?
J'ai cherché une réponse à ce problème toute la matinée, et la chose la plus utile que j'ai trouvée jusqu'à présent est cet article .
Bien que je n'aie pas encore implémenté la solution suggérée, il semble que ce soit sur la bonne voie.
Fondamentalement, le choix unique ListView
attend des widgets que vous lui fournissez qu'il implémente l'interface Checkable
. LinearLayout
et autres pas. Vous devez donc créer une mise en page personnalisée qui hérite de LinearLayout
(ou de la mise en page que vous souhaitez utiliser pour vos articles) et implémente l'interface nécessaire.
J'avais une situation similaire mais je l'ai corrigée facilement. Essaye ça:
Étendez ListActivity et définissez votre adaptateur de liste personnalisé
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE); //if you need title to be hidden
setContentView(R.layout.activity_add_to_cart_select_service_plan);
setListAdapter(adapter);
}
Créer un champ pour stocker la position d'index sélectionnée dans l'adaptateur
int selectedIndex = -1;
Lui fournir une interface
public void setSelectedIndex(int index){
selectedIndex = index;
}
Définissez l'état vérifié sur vrai ou faux en fonction de l'index sélectionné dans getView ()
@Override
public View getView(int position, View convertView, ViewGroup parent) {
RadioButton rbSelect = (RadioButton) convertView
.findViewById(R.id.radio1);
if(selectedIndex == position){
rbSelect.setChecked(true);
}
else{
rbSelect.setChecked(false);
}
}
Définissez les attributs des boutons radio focalisables et cliquables sur "faux"
<RadioButton
Android:id="@+id/radio1"
Android:checked="false"
Android:focusable="false"
Android:clickable="false"
/>
Définir l'attribut focusview descendantFocusability sur 'beforeDescendants'
<ListView
Android:id="@Android:id/list"
Android:choiceMode="singleChoice"
Android:descendantFocusability="beforeDescendants"
/>
Remplacer onListItemClick
@Override
protected void onListItemClick(ListView l, View v, int position, long id) {
super.onListItemClick(l, v, position, id);
adapter.setSelectedIndex(position);
adapter.notifyDataSetChanged();
}
C'est tout ... exécutez et vérifiez
Géré un problème similaire avec un Hack (Pas une solution parfaite .. mais fonctionne toujours ..)
listview.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
for (int i = 0; i < parent.getCount() ; i ++)
{
View v = parent.getChildAt(i);
RadioButton radio = (RadioButton) v.findViewById(R.id.radio);
radio.setChecked(false);
}
RadioButton radio = (RadioButton) view.findViewById(R.id.radio);
radio.setChecked(true);
}
});