1

行ごとに交互の背景色を持つ ListView を作成したいと思います。

私は一般的にAndroid開発は初めてですが、XamarinとMVVMCrossも気にしません:)

Android の世界と Xamarin の世界でこれを行う例がいくつかありますが、これを MVVM Cross の方法で設定する方法がわかりません。

私の理解では、これを Android 固有のビュー コードに実装する必要があります。そのためには、ListView にアダプターを設定する必要があります。このアダプターは、レンダリングされる各 List アイテムの背景色をプログラムで設定できます。

私はこの例を見つけました:

https://github.com/slodge/MvvmCross-Tutorials/tree/master/Working%20With%20Collections/Collections.Droid

CustomAdapter : MvxAdapterただし、実装すると、ビューを表示するときに次のメソッドが呼び出されないことがわかります。

GetBindableView, GetSimpleView, GetBindableView, GetView

この未回答の質問も見つけました

mono droid と mvvmcross を使用したカスタム リストビューの問題

MvxBindableListAdapterもはや存在しないように見えるものを使用します。

誰かが私を正しい方向に向けることができますか?

関連するさまざまなコード スニペットを次に示します。

TradeBookingResponseView.axml はこれを所有しています:

<Mvx.MvxListView
  android:id="@+id/TradeConfirmation"
  android:layout_width="fill_parent"
  android:layout_height="wrap_content"
  local:MvxBind="ItemsSource OpenTradeListItems"
  local:MvxItemTemplate="@layout/item_confirmation"
/>

その中にLinearLayout

item_confirmation.axml は次のとおりです。

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="horizontal"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:layout_toRightOf="@+id/tradingStateIcon"
    xmlns:local="http://schemas.android.com/apk/res-auto">
    <TextView
      android:layout_weight="0.35"
      android:text="Field"
      android:textAppearance="?android:attr/textAppearanceMedium"
      android:layout_width="0dip"
      android:layout_height="wrap_content"
      android:layout_marginLeft="10dip"
      android:id="@+id/tradeConfirmationField"
      local:MvxBind="Text Field" />
    <TextView
      android:layout_weight="0.65"
      android:text="Value"
      android:textAppearance="?android:attr/textAppearanceMedium"
      android:layout_width="0dip"
      android:layout_height="wrap_content"
      android:id="@+id/tradeConfirmationValue"
      local:MvxBind="Text Value"/>
</LinearLayout>

TradeBookingResponseViewModel はこれを公開します

public ObservableCollection<ConfirmationItem> OpenTradeListItems
{
    get
    {
        return openTradeListItems;
    }
    set
    {
        if (!Equals(value, openTradeListItems))
        {
            openTradeListItems = value;
            RaisePropertyChanged(() => OpenTradeListItems);
        }
    }
}

ビューコードが

public class TradeBookingResponseView : ViewBase
{
    public TradeBookingResponseView() : base(Resource.Layout.TradeBookingResponseView)
    {

    }

    protected override void OnViewModelSet()
    {
        SetContentView(Resource.Layout.TradeBookingResponseView);
        var list = FindViewById<ListView>(Resource.Id.TradeConfirmation);
        list.Adapter = new CustomAdapter(this, (IMvxAndroidBindingContext) BindingContext);
    }
}

public class CustomAdapter : MvxAdapter
{
    public CustomAdapter(Context context) : base(context)
    {
    }

    public CustomAdapter(Context context, IMvxAndroidBindingContext bindingContext) : base(context, bindingContext)
    {
    }

    protected override View GetBindableView(View convertView, object dataContext)
    {
        convertView.SetBackgroundColor(Color.Red);
        return base.GetBindableView(convertView, dataContext);
    }
}

ViewBase拡張する場所MvxActivity

そして、呼び出されるかどうかを確認するためだけに赤を設定しています(呼び出されません)。より多くの Android-y の例によるとView GetView(int position, View convertView, ViewGroup parent)、アイテムがどの位置にあるかを確認するために使用したいので、その上で % 2 を実行できます (これも呼び出されません)。

4

2 に答える 2

0

バックグラウンドを使用してデータバインドする方法は次のとおりです。カスタム テーブル テンプレート (item_confirmation) で、RowItem.RowId を OpenTradeListItems リストの ID に置き換えます。

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:local="http://schemas.android.com/apk/res-auto"
    ...
    local:MvxBind="BackgroundColor BackgroundColor(RowItem.RowId)">

そして、これが BackgroundColor コンバーターです。

public class BackgroundColorValueConverter : MvxColorValueConverter
{
    protected override MvxColor Convert(object value, object parameter, System.Globalization.CultureInfo culture)
    {
        return (int)value % 2 != 0 ? BusinessConstants.ThirdAlternateBGColor : null;
    }
}
于 2015-10-31T15:20:25.240 に答える