2013-09-24 44 views
1

我需要用複選框實現listview。 如果我選中10箇中的4個複選框,點擊一個按鈕後,無論選中哪個複選框,都必須查找那些行(對象)的詳細信息。 我搜索了很多,但我無法找到monodroid解決方案。 請幫幫我。ListView與複選框使用monodroid?

回答

0

你應該使用這種類型的適配器使用複選框ListView中:這裏getView方法BaseAdapter:

 ViewHolder viewHolder = null; 
    if (convertView == null) { 
     LayoutInflater inflator = context.getLayoutInflater(); 
     convertView = inflator.inflate(R.layout.row, null); 
     viewHolder = new ViewHolder(); 
     viewHolder.text = (TextView) convertView.findViewById(R.id.label); 
     viewHolder.checkbox = (CheckBox) convertView.findViewById(R.id.check); 
     viewHolder.checkbox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { 

      @Override 
      public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { 
       int getPosition = (Integer) buttonView.getTag(); // Here we get the position that we have set for the checkbox using setTag. 
       list.get(getPosition).setSelected(buttonView.isChecked()); // Set the value of checkbox to maintain its state. 
      } 
     }); 
     convertView.setTag(viewHolder); 
     convertView.setTag(R.id.label, viewHolder.text); 
     convertView.setTag(R.id.check, viewHolder.checkbox); 
     } else { 
     viewHolder = (ViewHolder) convertView.getTag(); 
    } 
    viewHolder.checkbox.setTag(position); // This line is important. 

    viewHolder.text.setText(list.get(position).getName()); 
    viewHolder.checkbox.setChecked(list.get(position).isSelected()); 
+0

我無法用C#語言實現。 – KiShOrE

+0

這是完整的java –

0

因此,不幸的解決您的問題涉及很多細節。我自己也在努力。沒有示例項目,但我試圖從工作解決方案中去除不必要的部分。希望這至少有助於概述我創建的結構。

適配器

public class MyItemListAdapter : BaseAdapter 
{ 
    private OrderedDictionary<Guid, ObjectRespresentingSingleRow> _items = new OrderedDictionary<Guid, ObjectRespresentingSingleRow>(); 
    private GuidHashSet _selectedItems = new GuidHashSet(); 

    public ICollection<ObjectRespresentingSingleRow> Items 
    { 
     get { return _itmes.Values; } 
    } 

    public event EventHandler<IntegerEventArgs> SelectedItemsChanged; 
    public event EventHandler<IntegerEventArgs> ItemsNumberChanged; 

    public void Add(ObjectRespresentingSingleRow item) 
    { 
     _items.Add(item.Id, item); 
     // Fire the ItemsNumberChanged event here 
     NotifyDataSetChanged(); 
    } 

    public void SelectAll() 
    { 
     _selectedItems.UnionWith(_items.Keys); 
     // Fire SelectedEventsChanged here 
     NotifyDataSetChanged(); 
    } 

    public void ClearSelected() 
    { 
     _selectedItems.Clear(); 
     // Fire SelectedEventsChanged here 
     NotifyDataSetChanged(); 
    } 

    // Will need to add all the overrides as well as some methods like (RemoveAllSelected(), SelectAt(), Clear(), ... etc) 

    public override View GetView(int position, View convertView, ViewGroup parent) 
    { 
     ItemViewHolder viewHolder; 
     ObjectRespresentingSingleRow listItem = _items[position].Value; 
     if (convertView == null) 
     { 
      viewHolder = new ItemViewHolder(); 
      convertView = _inflater.Inflate(Resource.Layout.LayoutItemListViewRow, null); 

      viewHolder.CheckBox = convertView.FindViewById<CheckBox>(Resource.Id.ItemListViewRowCheckBoxSelected); 
      viewHolder.OtherView = convertView.FindViewById<TextView>(Resource.Id.ItemListViewRowTextViewName); 

      // I also had to use a TouchDelegate on the CheckBox to extend the checkbox touchable area 

      // Save the view holder so that we do not have to find these view again for this particular item 
      convertView.Tag = viewHolder; 
     } 
     else 
     { 
      // Use the previous view holder (performance) 
      viewHolder = (ItemViewHolder)convertView.Tag; 
     } 

     // Since the views are reusable we need to rotate the click handlers for the views 
     viewHolder.CheckBox.Click -= viewHolder.ClickHandler; 
     viewHolder.ClickHandler = (object sender, EventArgs args) => 
     { 
      CheckBox checkBox = (CheckBox)sender; 
      if (checkBox.Checked) 
      { 
       _selectedItems.Add(listItem.Id); 
      } 
      else 
      { 
       _selectedItems.Remove(listItem.Id); 
      } 
      // Fire SelectedItemsChanged event here with the current number of selected items 
     }; 
     viewHolder.CheckBox.Click += viewHolder.ClickHandler; 

     // Popolate the view based on the event data 
     viewHolder.OtherView.Text = listItem.Text; 
     viewHolder.CheckBox.Checked = _selectedItems.Contains(listItem.Id); 
     // Populate the rest of the view ... etc 

     return convertView; 
    } 
} 

活動/片段顯示的列表

private MyItemListAdapter _itemListAdapter = null; 
    private ItemListActionCallback _actionCallback = null; 

private void OnCreate() 
{ 
    _itemListAdapter = new MyItemListAdapter(Activity); 
     _itemListAdapter.ItemsNumberChanged += OnItemsNumberChanged; 
     _itemListAdapter.SelectedItemsChanged += OnSelectedItemsChanged; 
     mainListView.ItemClick += OnItemsClicked; // Navigate to the item as well when area away from checkbox is touched 
     mainListView.Adapter = _itemListAdapter; 
} 

private void OnItemsNumberChanged(object sender, IntegerEventArgs args) 
    { 
     // Display empty if args.Value == 0 or something like it 
    } 


private void OnSelectedItemsChanged(object sender, IntegerEventArgs args) 
    { 
     if (args.Value == 0) 
     { 
      if (_actionMode != null) 
      { 
       // The last selected event was unselected, therefore exit action mode 
       _actionMode.Finish(); 
      } 
     } 
     else 
     { 
      if (_actionMode == null) 
      { 
       // At least one event was selected, start action mode 
       _actionMode = Activity.StartActionMode(_actionCallback); 
      } 
      // Update the action bar with the total number of selected events 
      _actionMode.Title = args.Value; // Format this 
     } 
    } 

如果你想要做的事,以通過操作欄選擇的對象,你將不得不實現這個作爲好。

public class ItemListActionCallback : Java.Lang.Object, ActionMode.ICallback 
{ 
    private readonly MyItemListAdapter _adapter = null; 

    public bool OnActionItemClicked(ActionMode mode, IMenuItem item) 
    { 
     switch (item.ItemId) 
     { 
      case Resource.Id.MenuDelete: 
       // Delete from local storage as well as from the adapater 
       _adapter.RemoveSelected(); 
       _adapter.NotifyDataSetChanged(); 
       mode.Finish(); 
       break; 
      case Resource.Id.MenuSelectAll: 
       _adapter.SelectAll(); 
       break; 
      default: 
       mode.Finish(); 
       break; 
     } 
     return true; 
    } 

    // See other examples on how to implement the rest 
} 

另外,請確保您的複選框有以下幾點:

android:focusable="false" 

這基本上模仿的Gmail做什麼。