行ごとに交互の背景色を持つ ListView を作成したいと思います。
私は一般的にAndroid開発は初めてですが、XamarinとMVVMCrossも気にしません:)
Android の世界と Xamarin の世界でこれを行う例がいくつかありますが、これを MVVM Cross の方法で設定する方法がわかりません。
私の理解では、これを Android 固有のビュー コードに実装する必要があります。そのためには、ListView にアダプターを設定する必要があります。このアダプターは、レンダリングされる各 List アイテムの背景色をプログラムで設定できます。
私はこの例を見つけました:
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 を実行できます (これも呼び出されません)。