我想创建一个每行具有交替背景颜色的ListView。
我对Android开发一般都不熟悉,不用担心Xamarin和MVVMCross:)
在Android世界和Xamarin世界中有一些这样做的例子,但我无法弄清楚如何以MVVM Cross方式设置它。
我的理解是我需要在Android特定的视图代码中实现这一点,为此我需要在ListView上设置一些适配器,它可以在呈现时以编程方式设置每个List项的背景颜色。
我找到了这个例子:
但是,一旦实现,我发现在显示视图时,CustomAdapter : MvxAdapter
上没有调用以下任何方法:
GetBindableView, GetSimpleView, GetBindableView, GetView
我也发现了这个悬而未决的问题
Issue with custom listview using mono droid and 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(这也不会被调用)。
答案 0 :(得分:2)
尝试在基本方法之后设置颜色 - 例如
public override GetView(int position, View convertView, ViewGroup parent)
{
var v = base.GetView(position, convertView, parent);
v.SetBackgroundColor( I %2 == 0 ? Color.Red : Color.Blue);
return v;
}
或者,如果您想
,可以对背景颜色进行数据绑定答案 1 :(得分:0)
以下是如何使用background进行数据绑定,在自定义表模板(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;
}
}