2015-07-20 14 views
5

Ho un ScrollView che originariamente comprendeva due controlli MvxListView.Come si associa a `ItemClick` per un` MvxLinearLayout`?

Avere i controlli ListView in un ScrollView non è supportato da Android, il che ha senso, perché entrambi cercano di riempire l'altezza del genitore e forniscono la propria logica di scorrimento.

Quello che voglio sono due elenchi non convertibili con tutta la loro altezza all'interno del mio ScrollView. ListView che estensioni MvxListView non supportano questo senza modificare manualmente l'altezza.

La ragione per cui voglio questo è perché ho due liste separate che ho deciso di separare le fonti e hanno entrambe la propria intestazione. Ho bisogno che tutto questo sia scorrevole all'interno di uno ScrollView.

Quindi ho trovato MvxLinearLayout che è un bindable LinearLayout che ha una proprietà ItemSource che posso associare a. Funziona in modo eccellente, mostra i miei articoli e ottiene l'altezza completa di tutti gli articoli in modo da poter scorrere entrambe le mie liste nel mio ScrollView. Il problema è che non sembra avere una proprietà ItemClick, quindi non ho un modo per ottenere l'input dell'utente dal mio elenco.

Qualcuno conosce un modo pulito per farlo in modo accettabile? Non voglio collegare i gestori onItemClick nel mio codice. C'è un altro controllo MvvmCross che può fare ciò che voglio?

+0

non capisco perché non puoi popolare tutti i tuoi dati in un canto le ListView? – Cheesebaron

risposta

10

È possibile estendere MvxLinearLayout per sostenere 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); 
     } 
    } 
} 

Adapter:

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

Ora è possibile associare a ItemClick proprio come si farebbe con un ListView: Ho

local:MvxBind="ItemClick SomeCommand" 
+2

Non funziona in MvvmCross 5.1 perché mvxDataConsumer è nullo quando analizzato (visualizza come IMvxDataConsumer). Qualche idea del perché? –

0

È necessario aggiungere un collegamento Click agli elementi separati all'interno del layout. È possibile aggiungere un Clicca per qualsiasi layout in questo modo:

<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

Ciao, grazie per la risposta. Sì, mi rendo conto che posso farlo, ma l'intero punto con 'MvxLinearLayout' è che ha un' ItemsSource' che è legato ai dati, quindi aggiunge automaticamente i miei elementi alla lista. Per fare ciò che proponi, devo rendere manualmente tutte le viste per i miei oggetti e associarli a "Click" o ciclicarli dopo che i dati vengono automaticamente associati a "MvxLinearLayout", che non è molto pulito da una prospettiva MVVM. –

0

Hai provato a specificare un modello di elemento per la MvxLinearLayout? ad es., local:MvxItemTemplate="@layout/item_template"? È possibile impostare il collegamento MvvmCross Click all'interno del modello di articolo sui controlli per i quali si desidera gestire i clic.

Problemi correlati