mvvmcross расширяемый список

Мне просто интересно, скрывается ли функциональность ExpandableListViews или аналогичная ей в рамках Mvvmmcross, или этот тип управления не применим к многоплатформенным требованиям. Функциональность доступна на странице http://deapsquatter.blogspot.com/2013/02/mvvmcrossdeapextensions.html — это круто, но не уверен, что функция разворачивания/свертывания доступна.

Любые указатели/образец кода будут оценены


person Kern    schedule 21.02.2013    source источник
comment
вам удалось это решить?   -  person Hugo Logmans    schedule 18.07.2013


Ответы (2)


Это об этом (я поместил это в код Deepsqautter). После того, как я привел код в порядок, я положу его где-нибудь под рукой, или, может быть, это полезное дополнение к самому mvvmcross...

Вид:

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) => 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);
    }
}

и адаптер

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<object>().ToList()[position];
    }

    public View GetChildView(int groupPosition, int childPosition, bool isLastChild, View convertView, ViewGroup parent)
    {
        var sublist = ((_itemsSource[groupPosition]) as IEnumerable).Cast<object>().ToList();

        var item = sublist[childPosition];
        return base.GetBindableView(convertView, item, ItemTemplateId);
    }

    public int GetChildrenCount(int groupPosition)
    {
        return ((_itemsSource[groupPosition]) as IEnumerable).Cast<object>().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
}

И пример кода XAML:

<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" />

А потом еще какой-то пример данных (псевдокод):

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<Subitem> {
  public String Name {get; set;}
}

// en some usage code
var chapters = new List<Chapter>();
var chapter = new Chapter(){Name = "chap 1"};
chapter.Add(new SubItem(){Name = " 1"});
chapter.Add(new SubItem(){Name = "item 2"});
chapters.Add(chap);

Это мой MvxBindingAttributes.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>
  <declare-styleable name="MvxBinding">
    <attr name="MvxBind" format="string"/>
    <attr name="MvxLang" format="string"/>
  </declare-styleable>
  <declare-styleable name="MvxControl">
    <attr name="MvxTemplate" format="string"/>
  </declare-styleable>
  <declare-styleable name="MvxListView">
    <attr name="MvxItemTemplate" format="string"/>
    <attr name="MvxDropDownItemTemplate" format="string"/>
    <attr name="GroupItemTemplate" format="string"/>

  </declare-styleable>
  <item type="id" name="MvxBindingTagUnique"/>
  <declare-styleable name="MvxImageView">
    <attr name="MvxSource" format="string"/>
  </declare-styleable>
</resources>

Кстати: у меня остался только один проект в MvvmCross, остальные были преобразованы в Xamarin.Forms или даже из Xamarin. Так что код больше не обновляется.

person Hugo Logmans    schedule 18.07.2013
comment
comment
Хьюго, этот код все еще работает? Я сделал обновление до MvvmCross 3.0.14 и скомпилировал код. Я ссылаюсь только на dll в своем проекте, но я не могу ее использовать. У вас есть пример проекта на github? - person Mario Duarte; 15.01.2014
comment
Да, это работает, но у меня нет примера проекта. В чем дело? - person Hugo Logmans; 15.01.2014
comment
Я добавил ссылку на вашу DLL (DeapExtensions.Binding и DeapExtensions.Binding.Droid). Скопировал файл BindingAttributes.xml в папку с моими ресурсами. Изменил файл axml. При компиляции я получил ошибку: Не найден идентификатор ресурса для атрибута "GroupItemTemplate" в пакете "heysr.app" - person Mario Duarte; 15.01.2014
comment
Тогда вы, вероятно, не редактировали mvxbindingattributes.xml в своем проекте. На том же уровне «MvxItemTemplate» добавьте строку «GroupItemTemplate». - person Hugo Logmans; 15.01.2014
comment
Ага! В этом была проблема. Теперь я могу скомпилировать свой проект, но ваш компонент не отображается на экране. Нужно ли мне вызывать какой-то плагин при инициализации? - person Mario Duarte; 15.01.2014
comment
Теперь это работает! Я создал класс DeapExtensionsPluginBootstrap, который вызывает ваш PluginLoader. Большое спасибо! - person Mario Duarte; 15.01.2014
comment
Спасибо. Если вы вносите улучшения, пожалуйста, создайте запрос на вытягивание, чтобы каждый мог извлечь из этого пользу. - person Hugo Logmans; 16.01.2014
comment
@HugoLogmans Как определить главы для привязки к ItemsSource? Можете ли вы привести пример. Спасибо - person RyanWang; 23.06.2014
comment
глава должна относиться к классу IEnumable‹subitem›. И вы предоставляете список IEnumerable‹Chapter› в ItemsSource. - person Hugo Logmans; 23.06.2014
comment
Я не совсем понимаю, как работают глава и подпункт. Можете ли вы опубликовать код, как вы их определяете? - person Jeremy; 08.09.2014
comment
@HugoLogmans, при компиляции я получил ошибку: не найден идентификатор ресурса для атрибута «GroupItemTemplate» в пакете. Я проверил свой mvxbindingattributes.xml и вижу запись GroupItemTemplate. Вот снимок атрибутов mvxbinding ‹declare-styleable name=MvxListView› ‹attr name=MvxItemTemplate format=string/› ‹attr name=MvxDropDownItemTemplate format=string/› ‹/declare-styleable› ‹declare-styleable name=MvxExpandableListView› ‹attr name= Формат GroupItemTemplate=string/› ‹/declare-styleable› - person Ravi Bhojani; 08.10.2015
comment
@RaviBhojani смотрите обновленный ответ для моего xml. Если он по-прежнему не работает, возможно, весь код устарел. У меня нет времени смотреть на это в данный момент, извините. - person Hugo Logmans; 09.10.2015
comment
В последних версиях вам больше не нужен MvxBindingAttributes. Также MvvmCross имеет сборку ExpandableListView. Пожалуйста, откройте новую тему, если вам нужна информация по этому вопросу. - person Martijn00; 09.10.2015

Насколько я знаю, этого еще никто не делал

Но вы можете довольно просто преобразовать существующий элемент управления Android в связанный элемент управления — вы видели, как это делается, в репозитории @deapsquatter.

Чтобы преобразовать ExpandableListView, я бы делал это по одному шагу за раз.

  1. Сначала получите данные в структуре, которую хотите использовать.
  2. Затем создайте несвязанный пользовательский интерфейс вручную — просто быстрое прототипирование
  3. Наконец, возьмите образец @deapsquatter и попробуйте применить те же принципы.

Когда/если вы сталкиваетесь с определенными проблемами, вы всегда можете вернуться сюда, чтобы задать их. Но если сначала поставить 1 и 2, у вас будет что-то серьезное, о чем можно спросить.

Надеюсь, это поможет.

person Stuart    schedule 21.02.2013