2 votes

Xamarin liste personnalisée à choix multiples

Je me demandais s'il y avait un moyen de créer une vue liste à choix multiple qui puisse effectivement renvoyer les index sélectionnés. J'ai réussi à le faire avec l'adaptateur prédéfini multiplechoicelistview mais j'ai besoin de pouvoir en modifier le style. J'ai donc besoin d'une liste personnalisée. Ceci est mon code onCreate

 protected override void OnCreate(Bundle savedInstanceState)
    {

        base.OnCreate(savedInstanceState);
        SetContentView(Resource.Layout.Options);
        outList = FindViewById(Resource.Id.outList);
        var btnCheck = FindViewById(Resource.Id.btnConfirm);
        var btnBack = FindViewById(Resource.Id.btnBack);
        for (int i = 0; i < NewProfileVars.LifeStyles.Length; i++)
        {
            inList.Add(NewProfileVars.LifeStyles[i].Name);
        }

        //list contents end here

        ListViewAdapter adapter = new ListViewAdapter(this, inList);
        outList.Adapter = adapter;
        outList.ChoiceMode = ChoiceMode.Multiple;
        NewProfile main = new NewProfile();
        btnCheck.Click += Confirm;
        btnBack.Click += Back;

    }

Et voici le code de mon adaptateur de liste

    class ListViewAdapter: BaseAdapter
    {
        public List Items;
        public Context Context;

        public ListViewAdapter(Context context, List items)
        {
            Items = items;
            Context = context;
        }

        public override int Count
        {
            get { return Items.Count; }
        }

        public override long GetItemId(int position)
        {
            return position;

        }
        public override string this[int position]
        {
            get { return Items[position]; }
        }

        public override View GetView(int position, View convertView, ViewGroup parent)
        {
            View row = convertView;

            if (row == null)
            {
                row = LayoutInflater.From(Context).Inflate(Resource.Layout.ListBox, null, false);

            }
            CheckBox txtName = row.FindViewById(Resource.Id.cbName);
            txtName.Text = Items[position];
            return row;
        }
    }

Tout ce dont j'ai besoin maintenant est de comprendre comment ce bouton de confirmation enregistrerait les éléments que j'ai sélectionnés. Merci d'avance pour l'aide.

5voto

pinedax Points 5958

Je vois que vous utilisez CheckBox dans votre ListView. Vous pourriez obtenir les éléments qui ont été cochés en utilisant quelque chose comme ceci :

Tout d'abord, créez une classe qui contiendra les données de votre élément et l'état cochée, pour l'exemple, appelons-la

public class LifeStylesListItem
{
    public string Name { get; set; }

    public bool IsSelected { get; set; }

    public LifeStylesListItem(string name)
    {
        Name = name;
    }
}

Ensuite, modifiez votre ListViewAdapter

Ajoutez un nouveau champ privé qui contiendra une liste de LifeStylesListItem

private List _list;

Initialisez la liste avec les éléments passés dans le constructeur.

public ListViewAdapter(Context context, List items)
{
    Items = items;
    _list = new List();

    // Vous créez une copie de vos éléments
    foreach (var item in items)
    {
        _list.Add(new LifeStylesListItem(item));
    }

    Context = context;
}

Dans la méthode GetView, abonnez-vous à l'événement CheckedChange de votre CheckBox. De cette façon, vous serez notifié lorsque son état est modifié. Vous devez également définir la propriété Checked en fonction de la valeur IsSelected de l'élément. Cela est nécessaire lorsque le ListView réutilisera votre cellule.

public override View GetView(int position, View convertView, ViewGroup parent)
{
    View row = convertView;

    if (row == null)
    {
        row = LayoutInflater.From(Context).Inflate(Resource.Layout.ListBox, null, false);

    }
    CheckBox txtName = row.FindViewById(Resource.Id.cbName);
    txtName.Text = _list[position].Name;
    txtName.Checked = _list[position].IsSelected;

    txtName.CheckedChange -= TxtName_CheckedChange;
    txtName.CheckedChange += TxtName_CheckedChange;

    return row;
}

Ajoutez la méthode de gestion de l'événement TxtName_CheckedChange

void TxtName_CheckedChange(object sender, CompoundButton.CheckedChangeEventArgs e)
{
    // Ces lignes sont utilisées pour obtenir la position du contrôle qui a été cliqué
    var obj = sender as CheckBox;
    var row = obj?.Parent as View; 
    var parent = row?.Parent as ListView;

    if (parent == null)
    {
        return;
    }

    var position = parent.GetPositionForView(row);

    // Une fois que vous avez la position, vous pouvez obtenir l'élément et changer
    // son IsSelected
    var item = _list[position];
    item.IsSelected = e.IsChecked;
}

Ensuite, une dernière méthode à ajouter dans l'adaptateur est celle qui renverra les éléments sélectionnés. Avec l'aide de Linq (using System.Linq doit être ajouté), vous pouvez interroger les éléments sélectionnés de cette manière.

public List GetCheckedItems()
{
    return _list
            .Where(a => a.IsSelected)
            .Select(b => b.Name)
            .ToList();
}

Maintenant, dans votre activité, il vous suffit d'appeler la méthode GetCheckedItems de ListViewAdapter sur le clic du bouton Confirmer :

private void Confirm(object sender, EventArgs e)
{
    var checkedItems = adapter.GetCheckedItems();
}

N'oubliez pas de changer adapter en champ privé dans votre activité

private ListViewAdapter adapter;

J'espère que cela vous aidera.-

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