2017-08-13 7 views
1

実際に選択したインデックスを返すことができる複数選択リストビューを作成する方法があるのだろうかと思いました。私はあらかじめ作られたmultiplechoicelistviewアダプタでそれを行うことができましたが、私はそれのスタイルを編集することができる必要があります。だから私はカスタムリストビューが必要です。 これは私が今必要なのは、その確認ボタンは、私が選択したものを保存する方法を見つけ出すことです私のOnCreateのコードXamarin custom multiple choice listview

protected override void OnCreate(Bundle savedInstanceState) 
    { 

     base.OnCreate(savedInstanceState); 
     SetContentView(Resource.Layout.Options); 
     outList = FindViewById<ListView>(Resource.Id.outList); 
     var btnCheck = FindViewById<ImageButton>(Resource.Id.btnConfirm); 
     var btnBack = FindViewById<ImageButton>(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; 


    } 

そして、ここでは私のリストビューアダプターコード

class ListViewAdapter: BaseAdapter<string> 
    { 
     public List<string> Items; 
     public Context Context; 

     public ListViewAdapter(Context context, List<string> 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<CheckBox>(Resource.Id.cbName); 
      txtName.Text = Items[position]; 
      return row; 
     } 
    } 

です。 アドバイスをいただきありがとうございます。

答えて

4

あなたのリストビューにCheckBoxが使用されています。

まず、あなたのListViewAdapter

を変更すると例えば者が

それを呼びましょう
public class LifeStylesListItem 
{ 
    public string Name { get; set; } 

    public bool IsSelected { get; set; } 

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

、あなたのアイテムデータとチェック状態を保持するクラスを作成します:あなたはどこCheckedはこのようなものを使用することのアイテムを得ることができます

トンで、リストを初期化LifeStylesListItem

private List<LifeStylesListItem> _list; 

のリストを保持する新しいプライベートフィールドを追加します。 heコンストラクタで渡されたItems。 GetView方法で

public ListViewAdapter(Context context, List<string> items) 
{ 
    Items = items; 
    _list = new List<LifeStylesListItem>(); 

    //Your are creating a copy of your Items 
    foreach (var item in items) 
    { 
     _list.Add(new LifeStylesListItem(item)); 
    } 

    Context = context; 
} 

あなたのCheckBoxのCheckedChangeイベントをサブスクライブします。これにより、チェック状態が変更されたときに通知されます。 Item IsSelected値に基づいてCheckedプロパティを設定する必要があります。これは、ListViewがセルを再利用する場合に必要です。

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<CheckBox>(Resource.Id.cbName); 
    txtName.Text = _list[position].Name; 
    txtName.Checked = _list[position].IsSelected; 

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

    return row; 
} 

イベントハンドラに

void TxtName_CheckedChange(object sender, CompoundButton.CheckedChangeEventArgs e) 
{ 
    //These lines are used to get the position of the control that was clicked 
    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); 

    // Once you have the position you can get the item and change 
    // its IsSelected 
    var item = _list[position]; 
    item.IsSelected = e.IsChecked; 
} 

TxtName_CheckedChangeメソッドを追加し、アダプタを追加する最後の方法は、選択したアイテムを返します一つです。 Linq(using System.Linqを追加する必要があります)の助けを借りて、このような選択項目を照会することができます。

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

は、今すぐあなたの活動にあなただけの確認ボタンをクリックしたときに、ListViewAdapterメソッドからGetCheckedItemsを呼び出す必要があります:

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

があなたの活動にプライベートフィールドとしてadapterを変更することを忘れないでください

private ListViewAdapter adapter; 

希望するヘルプ.-

+1

あなたはウィザードですあなたはこれほど多くの年齢で私を悩ませています。リスト項目はすでにブール値を持つ構造体に属していたので、listviewアダプタはその構造体を使用しました。 もう一度、本当にありがとうございます。 –

+0

うれしかった! – apineda

+1

待ってくださいそれは単一選択ラジオボタンのためにどのように動作するか知っていますか? –

関連する問題