web-dev-qa-db-fra.com

ListView à choix unique personnalisé

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

http://db.tt/ulP6pn7V

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?

20
Nitin4Android

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.

12
Jules

J'avais une situation similaire mais je l'ai corrigée facilement. Essaye ça:

  1. É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);
    }
    
  2. Créer un champ pour stocker la position d'index sélectionnée dans l'adaptateur

    int selectedIndex = -1;
    
  3. Lui fournir une interface

    public void setSelectedIndex(int index){
        selectedIndex = index;
    }
    
  4. 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);
        }
    }
    
  5. 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"
     />
    
  6. Définir l'attribut focusview descendantFocusability sur 'beforeDescendants'

    <ListView
        Android:id="@Android:id/list"
        Android:choiceMode="singleChoice"
        Android:descendantFocusability="beforeDescendants"
    />
    
  7. 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

91
skpal202

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



            }
        });
3
ASP