2013-07-30 3 views
1

Я хотел бы создать ListView с переменным цветом фона для каждой строки.Android MVVM Cross v3 - Как создать ListView с чередующимися цветами строк

Я новичок в разработке Android в целом, не говоря уже о Xamarin и MVVMCross а :)

Есть некоторые примеры делать это в Android и миром Xamarin, но я не могу понять как установить это в перекрестке MVVM.

Мое понимание заключается в том, что мне нужно будет реализовать это в конкретном коде просмотра Android, и для этого мне нужно будет установить какой-либо адаптер в ListView, который может программно установить цвет фона для каждого элемента «Список» по мере их рендеринга.

Я нашел этот пример:

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

Однако после внедрения я считаю, что ни один из следующих методов не вызывается на моем CustomAdapter : MvxAdapter при отображении вида:

GetBindableView, GetSimpleView, GetBindableView, GetView

I также нашел этот неотвеченный вопрос

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 предоставляет th является

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 на нем (это также не вызывается).

ответ

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

В качестве альтернативы вы можете данные связать цвет фона, если вы хотите

0

Вот как данные связываются с использованием фона, в вашем Настраиваемый шаблон таблицы (item_confirmation), заменить мой RowItem.RowId с идентификатором вашего списка OpenTradeListItems:

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