Я хотел настроить цвет выделения списка mvxbindable со стандартного оранжевого на цвет, устанавливаемый динамически. Я думал, что это будет легко, но ошибался :)

Я обнаружил, что должен установить фоновый рисунок элемента списка в адаптере с помощью StateListDrawable. Я делаю это следующим образом (зеленый цвет - для теста, а в конструкторе создается _backgroundGradient);

 public override View GetView(int position, View convertView, ViewGroup parent)
        {
            var view =base.GetView(position, convertView, parent);

            StateListDrawable sld = new StateListDrawable();


            sld.AddState(new int[] { Android.Resource.Attribute.StateFocused }, new ColorDrawable(Color.Green));

            sld.AddState(new int[] { Android.Resource.Attribute.StatePressed }, new ColorDrawable(Color.Green));

            sld.AddState(new int[] {}, _backgroundGradient);

            view.Focusable = true;

            if (view != null)
            {
                view.SetBackgroundDrawable(sld);     
            }


            return view;
        }

Однако при щелчке по элементу списка цвет не отображается. Следующее из моего xml:

<listitem>

<LinearLayout
  xmlns:android="http://schemas.android.com/apk/res/android"
  xmlns:local="http://schemas.android.com/apk/res/dk.appsfabrikken.cmsapp"
  android:id="@+id/tableViewItem"
  android:layout_width="fill_parent"
  android:layout_height="90dp"
  android:paddingBottom="1dp"

  local:MvxBind="{'Click':{'Path':'ShowCellDetails'}}">

  <CmsApp.Droid.Controls.UmbracoImageView
    android:id="@+id/viewImagePreview"
    android:layout_width="90dp"
    android:layout_height="90dp"
    android:scaleType="centerCrop"
    android:padding="5dp"
    local:MvxBind="{'ImageData':{'Path':'ImageIconData'},'HideImage':{'Path':'Hidden'}}" />

  <TextView
    android:layout_gravity="center_vertical"
    android:id="@+id/title"
    android:textStyle="bold"
    android:textColor="@color/table_text"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_marginLeft="5dp"
    local:MvxBind="{'Text':{'Path':'Title'}}" />

</LinearLayout>

Должно быть, мне чего-то не хватает - любая помощь приветствуется.

1
Bjarke 28 Июн 2013 в 13:28

1 ответ

Лучший ответ

Хорошо, я сам решил. Возможно, это ошибка новичка, но я решил ее. Я попытался добавить событие щелчка в представление, но это тоже не сработало. Поэтому я решил добавить StateListDrawable в линейную компоновку элемента списка вместо фона представления. Это решило мою проблему.

Я добавил в свой метод в адаптере следующее:

  var ll = view.FindViewById<LinearLayout>(Resource.Id.tableViewItem);
            if (ll != null)
            {
                ll.SetBackgroundDrawable(sld);
            } 

Я до сих пор не совсем уверен, почему это не сработало, когда я добавил его в фон просмотра. Надеюсь, это спасет чей-то день, как испортило мой :)

1
Bjarke 28 Июн 2013 в 16:28
Вы знаете, что можете сделать это прямо в XML?
 – 
Cheesebaron
28 Июн 2013 в 18:15
Да, но определение цветов динамическое и извлекается из веб-службы.
 – 
Bjarke
1 Июл 2013 в 10:32