2015-07-20 1 views
5

У меня есть ScrollView, который изначально обернул два элемента управления MvxListView.Как мне привязать `ItemClick` к` MvxLinearLayout`?

Наличие ListView элементов управления в ScrollView не поддерживается Android, хотя это и имеет смысл, поскольку они оба пытаются заполнить родительскую высоту и предоставить свою собственную логику прокрутки.

Что я хочу - это два незапрашиваемых списка с их полной высотой внутри моего ScrollView. ListView, который поддерживает MvxListView, не поддерживает это без взлома высоты вручную.

Причина, по которой я хочу это, состоит в том, что у меня есть два отдельных списка, которые я связывал с отдельными источниками, и оба они имеют свой собственный заголовок. Мне нужно, чтобы все это прокручивалось за один ScrollView.

Затем я нашел MvxLinearLayout, который является связываемым LinearLayout, который имеет свойство ItemSource, с которым я могу связаться. Он отлично работает, он показывает мои предметы и получает полный рост всех предметов, поэтому я могу прокручивать оба моих списка в своем ScrollView. Проблема в том, что у него нет свойства ItemClick, поэтому у меня нет способа получить пользовательский ввод из моего списка.

Кто-нибудь знает, как это сделать в связном виде? Я не хочу прикреплять onItemClick обработчиков в моем коде. Есть ли другой элемент управления MvvmCross, который может делать то, что я хочу?

+0

I не понимаю, почему вы не можете заполнить все свои данные в пение le ListView? – Cheesebaron

ответ

10

Вы можете расширить MvxLinearLayout поддержать ItemClick:

public class MvxClickableLinearLayout : MvxLinearLayout 
{ 
    public MvxClickableLinearLayout(Context context, IAttributeSet attrs) 
     : this(context, attrs, new MvxClickableLinearLayoutAdapter(context)) 
    { 
    } 

    public MvxClickableLinearLayout(Context context, IAttributeSet attrs, MvxClickableLinearLayoutAdapter adapter) 
     : base(context, attrs, adapter) 
    { 
     var mvxClickableLinearLayoutAdapter = Adapter as MvxClickableLinearLayoutAdapter; 
     if (mvxClickableLinearLayoutAdapter != null) 
     { 
      mvxClickableLinearLayoutAdapter.OnItemClick = OnItemClick; 
     } 
    } 

    public ICommand ItemClick { get; set; } 

    public void OnItemClick(object item) 
    { 
     if (ItemClick != null && ItemClick.CanExecute(item)) 
     { 
      ItemClick.Execute(item); 
     } 
    } 
} 

адаптер:

public class MvxClickableLinearLayoutAdapter : MvxAdapterWithChangedEvent, View.IOnClickListener 
{ 
    public delegate void ItemClickDelegate(object item); 

    public ItemClickDelegate OnItemClick; 

    public MvxClickableLinearLayoutAdapter(Context context) 
     : base(context) 
    { 
    } 

    public void OnClick(View view) 
    { 
     var mvxDataConsumer = view as IMvxDataConsumer; 

     if (mvxDataConsumer != null && OnItemClick != null) 
     { 
      OnItemClick(mvxDataConsumer.DataContext); 
     } 
    } 

    protected override View GetView(int position, View convertView, ViewGroup parent, int templateId) 
    { 
     View view = base.GetView(position, convertView, parent, templateId); 
     view.SetOnClickListener(this); 
     return view; 
    } 
} 

Теперь вы можете связать с ItemClick так же, как вы могли бы сделать с ListView:

local:MvxBind="ItemClick SomeCommand" 
+2

Не работает в MvvmCross 5.1, потому что mvxDataConsumer имеет значение null при анализе (просмотр как IMvxDataConsumer). Любая идея о том, почему? –

0

Вам нужно добавить привязку Click к отдельным элементам внутри макета. Вы можете добавить Нажмите на любой макет, как это:

<RelativeLayout 
    android:background="?android:attr/selectableItemBackground" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:id="@+id/relativeLayout1" 
    local:MvxBind="Click SomeCommand"> 
+0

Привет, спасибо за ответ. Да, я понимаю, что могу это сделать, но весь смысл с MvxLinearLayout заключается в том, что он имеет «ItemsSource», который связан данными, поэтому он автоматически добавляет мои элементы в список. Чтобы сделать то, что вы предлагаете, я должен либо вручную сделать все представления для своих элементов, либо привязать их к «щелчку» или пропустить их после того, как они автоматически привяжут данные к «MvxLinearLayout», что не очень чистое с точки зрения MVVM. –

0

Вы пытались указать элемент шаблона для MvxLinearLayout? например, local:MvxItemTemplate="@layout/item_template"? Вы можете настроить привязку кликов MvvmCross в шаблоне элементов на элементах управления, для которых вы хотите обрабатывать клики.