2016-04-29 53 views
0

我有一個MvxListView,正確工作並顯示我需要的信息。我甚至有我的ItemClick命令正常工作。我現在弄不清楚的是如何獲取用戶點擊的視圖單元格。我想展開用戶點擊的視圖單元格。下面是一些代碼示例什麼我的工作:如何返回使用MvxListView單擊的ListView項目?

視圖模型:

private List<ContactItemEncrypted> _contactsEncryted; 
    public List<ContactItemEncrypted> ContactsEncrypted 
    { 
     get { return _contactsEncryted; } 
     set { _contactsEncryted = value; RaisePropertyChanged(() => ContactsEncrypted); } 
    } 

    private MvxCommand<ContactItemDecrypted> _itemSelectedCommand; 
    public System.Windows.Input.ICommand ItemSelectedCommand 
    { 
     get 
     { 
      _itemSelectedCommand = _itemSelectedCommand ?? new MvxCommand<ContactItemDecrypted>(DoSelectItem); 
      return _itemSelectedCommand; 
     } 
    } 

    private void DoSelectItem(ContactItemDecrypted item) 
    { 
     var message = new ContactSelectedMessage(this, item); 
     _messenger.Publish(message); 
    } 

查看:

[Activity(
    Label = "Contacts", 
    Theme = "@style/AppTheme", 
    ScreenOrientation = ScreenOrientation.Portrait 
)] 
public class ContactsListView : MvxAppCompatActivity 
{ 
    private MvxListView _listView; 
    private MvxSubscriptionToken _tokenContactSelected; 

    protected override void OnCreate(Bundle bundle) 
    { 
     base.OnCreate(bundle); 
     SetContentView(Resource.Layout.ContactsListScreen); 

     _listView = FindViewById<MvxListView>(Resource.Id.contactListView); 

     var messenger = Mvx.Resolve<IMvxMessenger>(); 

     _tokenContactSelected = messenger.SubscribeOnMainThread<ContactSelectedMessage>(ContactSelected); 
    } 

    private void ContactSelected(ContactSelectedMessage obj) 
    { 
     ExpandView(_listView.Adapter.GetPosition(obj.SelectedContact)); 
    } 

    private void ExpandView(int index) 
    { 
     itemLayout.Visibility = ViewStates.Visible; 
    } 
} 

使用ListView的佈局:

<?xml version="1.0" encoding="utf-8"?> 
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:local="http://schemas.android.com/apk/res-auto" 
android:layout_width="fill_parent" 
android:layout_height="fill_parent"> 
<Mvx.MvxListView 
    android:id="@+id/contactListView" 
    android:orientation="vertical" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    local:MvxBind="ItemsSource ContactsDecrypted; ItemClick ItemSelectedCommand; ItemLongClick ItemLongClickCommand" 
    local:MvxItemTemplate="@layout/contactlistviewitemtemplate" /> 
</FrameLayout> 

而ItemTemplate佈局:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:custom="http://schemas.android.com/apk/res-auto" 
android:layout_width="match_parent" 
android:layout_height="wrap_content" 
android:orientation="vertical" 
android:minWidth="25px" 
android:minHeight="25px"> 
<TextView 
    android:id="@+id/textViewName" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:textSize="18dp" 
    android:textColor="@color/black" 
    android:layout_margin="14dp" 
    custom:MvxBind="Text FullName" /> 
</LinearLayout> 

請記住,我沒有寫出擴展視圖的代碼。我不想從那開始,直到我真正有了我可以使用的觀點。

謝謝。

回答

1

您需要在ContactsListView中實施AdapterView.IOnItemClickListener,以便您可以接收被單擊的項目。

但是這需要一些定製,因爲實施AdapterView.IOnItemClickListener似乎抵消MvvmCross ICommand的結合。

綜觀MvxListView我們可以看到用於調用項目ICommand代碼的code:在我們OnItemClick

public void OnItemClick(AdapterView parent, View view, int position, long id) 
{ 
    MvxListView listView = parent as MvxListView; 
    if (listView == null) 
     return; 

    var item = listView.Adapter.GetRawItem(position); 

    if(item == null) 
     return; 

    if (!listView.ItemClick.CanExecute(item)) 
     return; 

    listView.ItemClick.Execute(item); 

    // Write your code here for expanding the view 
} 

protected virtual void ExecuteCommandOnItem(ICommand command, int position) 
{ 
    if (command == null) 
     return; 

    var item = this.Adapter.GetRawItem(position); 
    if (item == null) 
     return; 

    if (!command.CanExecute(item)) 
     return; 

    command.Execute(item); 
} 

實現這個我不知道,如果是這樣的要走的路,但它是實現你想要的東西的一種方法。

0

ItemClickCommand只會給你ViewModel而不是視圖。爲了做到這一點,您需要創建自己的綁定,以返回ItemClick上的視圖,類似於MvvmCross附帶的視圖。或者訂閱ListView上的ItemClicked事件並處理那裏的東西。

前者可能不是最好的主意,因爲它不會是平臺不可知的,你必須從視圖設置命令,這對我來說似乎有點愚蠢。

因此,我猜想MvxListView/ListView上的ItemClick事件的簡單訂閱將能夠完成返回視圖的工作。

另一種方法是通過視圖單元格的綁定ViewModel的屬性切換展開,該視圖單元格可以通過動畫或任何您喜歡的方式切換可見性。

0

我試過@Pilatus解決方案,它似乎有一些額外的工作。在實現AdapterView.IOnItemClickListener後,我最終使用了OnItemClick方法。我必須做的額外事情是設置_listView。OnItemClickListener = this; (這是實現AdapterView.IOnItemClickListener的類)。然後,我可以使用傳入該方法的視圖並對其進行處理。

另外,作爲一個附加說明,ICommand綁定沒有被取消。在我的實現中,兩個事件都被觸發了!

相關問題