Note that there are some explanatory texts on larger screens.

plurals
  1. PO
    text
    copied!<p>This is about it (I placed it into Deepsqautter's code). After I tidied up the code, I will place it somewhere handy, or maybe it's a usefull addition to mvvmcross itself...</p> <p>The view:</p> <pre><code>public class BindableExpandableListView : ExpandableListView { public BindableExpandableListView(Context context, IAttributeSet attrs) : this(context, attrs, new BindableExpandableListAdapter(context)) { } public BindableExpandableListView(Context context, IAttributeSet attrs, BindableExpandableListAdapter adapter) : base(context, attrs) { var groupTemplateId = MvxAttributeHelpers.ReadAttributeValue(context, attrs, MvxAndroidBindingResource.Instance .ListViewStylableGroupId, AndroidBindingResource.Instance .BindableListGroupItemTemplateId); var itemTemplateId = MvxAttributeHelpers.ReadListItemTemplateId(context, attrs); SetAdapter(adapter); adapter.GroupTemplateId = groupTemplateId; adapter.ItemTemplateId = itemTemplateId; } // An expandableListView has ExpandableListAdapter as propertyname, but Adapter still exists but is always null. protected BindableExpandableListAdapter ThisAdapter { get { return ExpandableListAdapter as BindableExpandableListAdapter; } } private IEnumerable _itemsSource; [MvxSetToNullAfterBinding] public virtual IEnumerable ItemsSource { get { return ThisAdapter.ItemsSource; } set { ThisAdapter.ItemsSource = value; } } public int ItemTemplateId { get { return ThisAdapter.ItemTemplateId; } set { ThisAdapter.ItemTemplateId = value; } } private ICommand _itemClick; public new ICommand ItemClick { get { return _itemClick; } set { _itemClick = value; if (_itemClick != null) EnsureItemClickOverloaded(); } } public ICommand GroupClick { get; set; } private bool _itemClickOverloaded = false; private void EnsureItemClickOverloaded() { if (_itemClickOverloaded) return; _itemClickOverloaded = true; base.ChildClick += (sender, args) =&gt; ExecuteCommandOnItem(this.ItemClick, args.GroupPosition, args.ChildPosition); } protected virtual void ExecuteCommandOnItem(ICommand command, int groupPosition, int position) { if (command == null) return; var item = ThisAdapter.GetRawItem(groupPosition, position); if (item == null) return; if (!command.CanExecute(item)) return; command.Execute(item); } </code></pre> <p>}</p> <p>and the adapter</p> <pre><code>public class BindableExpandableListAdapter : MvxAdapter, IExpandableListAdapter { private IList _itemsSource; public BindableExpandableListAdapter(Context context) : base(context) { } int groupTemplateId; public int GroupTemplateId { get { return groupTemplateId; } set { if (groupTemplateId == value) return; groupTemplateId = value; // since the template has changed then let's force the list to redisplay by firing NotifyDataSetChanged() if (ItemsSource != null) NotifyDataSetChanged(); } } protected override void SetItemsSource(System.Collections.IEnumerable value) { Mvx.Trace("Setting itemssource"); if (_itemsSource == value) return; var existingObservable = _itemsSource as INotifyCollectionChanged; if (existingObservable != null) existingObservable.CollectionChanged -= OnItemsSourceCollectionChanged; _itemsSource = value as IList; var newObservable = _itemsSource as INotifyCollectionChanged; if (newObservable != null) newObservable.CollectionChanged += OnItemsSourceCollectionChanged; if (value != null) { // dit weggehaald FlattenAndSetSource(value); } else base.SetItemsSource(null); } public int GroupCount { get { return (_itemsSource != null ? _itemsSource.Count : 0); } } public void OnGroupExpanded(int groupPosition) { // do nothing } public void OnGroupCollapsed(int groupPosition) { // do nothing } public bool IsChildSelectable(int groupPosition, int childPosition) { return true; } public View GetGroupView(int groupPosition, bool isExpanded, View convertView, ViewGroup parent) { var item = _itemsSource[groupPosition]; return base.GetBindableView(convertView, item, GroupTemplateId); } public long GetGroupId(int groupPosition) { return groupPosition; } public Java.Lang.Object GetGroup(int groupPosition) { return null; } public long GetCombinedGroupId(long groupId) { return groupId; } public long GetCombinedChildId(long groupId, long childId) { return childId; } public object GetRawItem(int groupPosition, int position) { return ((_itemsSource[groupPosition]) as IEnumerable).Cast&lt;object&gt;().ToList()[position]; } public View GetChildView(int groupPosition, int childPosition, bool isLastChild, View convertView, ViewGroup parent) { var sublist = ((_itemsSource[groupPosition]) as IEnumerable).Cast&lt;object&gt;().ToList(); var item = sublist[childPosition]; return base.GetBindableView(convertView, item, ItemTemplateId); } public int GetChildrenCount(int groupPosition) { return ((_itemsSource[groupPosition]) as IEnumerable).Cast&lt;object&gt;().ToList().Count(); } public long GetChildId(int groupPosition, int childPosition) { return childPosition; } public Java.Lang.Object GetChild(int groupPosition, int childPosition) { return null; } //public object GetRawItem </code></pre> <p>}</p> <p>And example XAML code:</p> <pre><code>&lt;DeapExtensions.Binding.Droid.Views.BindableExpandableListView android:minWidth="25px" android:minHeight="25px" android:id="@+id/toclist" android:layout_width="fill_parent" android:layout_height="fill_parent" local:MvxBind="ItemsSource Chapters; ItemClick ShowCommand" local:MvxItemTemplate="@layout/indextocsectionlistitem" local:GroupItemTemplate="@layout/indextocitem" android:background="@android:color/white" /&gt; </code></pre> <p>And then even some data example (pseudo code):</p> <pre><code>public class SubItem { public String Name {get; set;} } // this is the special part: a chapter does not CONTAIN a sublist, but IS a list of subitems. public class Chapter : List&lt;Subitem&gt; { public String Name {get; set;} } // en some usage code var chapters = new List&lt;Chapter&gt;(); var chapter = new Chapter(){Name = "chap 1"}; chapter.Add(new SubItem(){Name = " 1"}); chapter.Add(new SubItem(){Name = "item 2"}); chapters.Add(chap); </code></pre> <p>This is my MvxBindingAttributes.xml</p> <pre><code>&lt;?xml version="1.0" encoding="utf-8"?&gt; &lt;resources&gt; &lt;declare-styleable name="MvxBinding"&gt; &lt;attr name="MvxBind" format="string"/&gt; &lt;attr name="MvxLang" format="string"/&gt; &lt;/declare-styleable&gt; &lt;declare-styleable name="MvxControl"&gt; &lt;attr name="MvxTemplate" format="string"/&gt; &lt;/declare-styleable&gt; &lt;declare-styleable name="MvxListView"&gt; &lt;attr name="MvxItemTemplate" format="string"/&gt; &lt;attr name="MvxDropDownItemTemplate" format="string"/&gt; &lt;attr name="GroupItemTemplate" format="string"/&gt; &lt;/declare-styleable&gt; &lt;item type="id" name="MvxBindingTagUnique"/&gt; &lt;declare-styleable name="MvxImageView"&gt; &lt;attr name="MvxSource" format="string"/&gt; &lt;/declare-styleable&gt; &lt;/resources&gt; </code></pre> <p>BTW: I have only one project left in MvvmCross, the rest has been converted to Xamarin.Forms or even away from Xamarin. So code is not updated anymore.</p>
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload