2 votes

Android : Comment être notifié lorsque la sélection change dans une ListView à choix unique ?

Je veux que mon ListView mette en évidence l'élément sélectionné jusqu'à ce que la sélection change. De plus, je veux être notifié lorsque la sélection change.

Afin d'accomplir la première tâche, j'appelle list.setChoiceMode(ListView.CHOICE_MODE_SINGLE) .

Je ne suis pas sûr de savoir comment accomplir le second. Lorsqu'un élément de la liste est cliqué, mon OnItemSelectedListener n'est jamais notifié, et le OnItemClickListener est insuffisant parce qu'au moment où l'événement OnItemClick se produit, le checkedItem de ma ListView a été modifié, de sorte que je ne peux pas distinguer si l'événement de clic a entraîné un changement de sélection (il est possible/probable que l'élément cliqué était déjà sélectionné).

Une option serait de stocker l'index actuellement coché dans une variable membre, que je pourrais utiliser pour déterminer si l'événement de clic correspond à un changement de sélection. Mais cette solution laide et Donc, pour ce mode de choix, il y a certainement un moyen de faire cela avec les listeners fournis ?

public class Temp extends Activity implements OnItemClickListener, OnItemSelectedListener
{
    ListView mView;

    @Override
    public void onCreate(Bundle savedInstanceState) 
    {
        super.onCreate(savedInstanceState);

        List<String> strings = new ArrayList<String>();
        strings.add("1");
        strings.add("2");
        strings.add("3");
        strings.add("4");
        strings.add("5");

        mView = new ListView(this);
        mView.setChoiceMode(ListView.CHOICE_MODE_SINGLE);
        mView.setAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_list_item_activated_1, strings));
        mView.setItemChecked(0, true);

        mView.setOnItemClickListener(this);
        mView.setOnItemSelectedListener(this);

        setContentView(mView);
    }

    @Override
    public void onItemSelected(AdapterView<?> parent, View view, int position, long id)
    {
        //this never gets called
        Log.e("item selected", ""+position);
    }

    @Override
    public void onNothingSelected(AdapterView<?> parent)
    {
        Log.e("nothing seleted", "");
    }

    @Override
    public void onItemClick(AdapterView<?> parent, View view, int position, long id)
    {
                //by the time this occurs, position == mView.getCheckedItemPosition()
        Log.e("item clicked", ""+position);
    }
}

7voto

Sam Points 47925

Lorsqu'un élément de la liste est cliqué, mon OnItemSelectedListener n'est jamais notifié.

L'écouteur OnItemSelectedListener est uniquement appelé par une ListView lorsque vous utilisez une boule de commande, une navigation au clavier ou un autre type de navigation non tactile. Il n'y a pas de corrélation avec le mode de choix.

Une option serait de stocker l'index actuellement coché dans une variable membre, que je pourrais utiliser pour déterminer si l'événement de clic correspond à un changement de sélection.

C'est la meilleure option. Elle n'implique qu'une seule int et une instruction "if".

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X