Фон выбранного элемента MvxRecycleView

Как установить фон выбранного элемента в MvxRecycleView?

Я хочу изменить фон выбранного элемента, а другой.

selector_category_item.xml

<?xml version = "1.0" encoding = "utf-8"?>
<selector xmlns:android = "http://schemas.android.com/apk/res/android">
    <item  android:state_pressed = "true"  android:state_enabled = "true"  >
        <shape android:shape = "rectangle">
            <solid android:color = "@color/colorPrimary"/>
        </shape>
            </item>

    <item android:state_checked = "false" android:state_enabled = "true"  >
        <shape android:shape = "rectangle">
            <solid android:color = "@color/grayBackground"/>
        </shape>
    </item>
</selector>

Мой MvxRecycleView

<MvxRecyclerView
            android:overScrollMode = "never"
            android:scrollbars = "vertical"
            android:background = "#e2e2e2"
            android:layout_width = "0dp"
            android:layout_height = "match_parent"
            android:layout_weight = "1"
            local:MvxItemTemplate = "@layout/category_item"
            local:MvxBind = "ItemsSource Categories; ItemClick SelectCategoryCommand; SelectedItem SelectedCategory"
            android:id = "@+id/categoryRecyclerView" />

И category_item.xml

<?xml version = "1.0" encoding = "utf-8"?>
<LinearLayout xmlns:android = "http://schemas.android.com/apk/res/android"
    xmlns:local = "http://schemas.android.com/apk/res-auto"
    android:layout_width = "match_parent"
    android:layout_height = "wrap_content"
    android:padding = "16dp"
    android:clickable = "true"
    android:background = "@drawable/selector_category_item"
    android:layout_marginBottom = "1dp"
    android:orientation = "vertical">
    <RelativeLayout
        android:layout_width = "match_parent"
        android:layout_height = "wrap_content">
        <ffimageloading.cross.MvxCachedImageView
            android:id = "@+id/categoryImage"
            android:layout_width = "wrap_content"
            android:layout_height = "wrap_content"
            local:MvxBind = "DrawableName CategoryImage" />
        <ImageView
            android:id = "@+id/favIcon"
            android:layout_width = "wrap_content"
            android:layout_height = "wrap_content"
            android:layout_centerVertical = "true"
            android:layout_alignParentEnd = "true"
            android:src = "@drawable/no_fav_icon" />
    </RelativeLayout>
    <TextView
        android:clickable = "true"
    android:focusableInTouchMode = "true"
    android:focusable = "true"
        android:layout_marginTop = "8dp"
        android:id = "@+id/categoryText"
        style = "@style/TextStyleBlack"
        android:fontFamily = "@font/roboto_regular"
        android:letterSpacing = "-0.04"
        android:lineSpacingExtra = "0sp"
        android:layout_width = "match_parent"
        android:layout_height = "wrap_content"
        local:MvxBind = "Text Name"
        android:textSize = "14sp" />
</LinearLayout>

Мне нужно изменить фон выбранного элемента на другой, пока элемент выбран. Как я могу разобраться?

0
0
750
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

  1. Сделайте логический флаг для сохранения выбранного состояния для каждого элемента категории на Category model.
  2. На вашем адаптере viewHolder создайте экземпляр для корневого представления элемента ресайклера mBackground.
  3. На onBindViewHolder обновите статус выбора mBackground.

    class MyDataHolder extends RecyclerView.ViewHolder
        implements View
        .OnClickListener {
    LinearLayout mBackground;
    MyDataHolder(View itemView) {
        super(itemView);
        mBackground = (LinearLayout) itemView.findViewById(R.id.my_item_root_view);
        itemView.setOnClickListener(this);
    }
    
    
    
    @Override
    public void onBindViewHolder(MyCategoryAdapter.MyDataHolder holder, int position) {
        final Category category = getItem(position);
        holder.mBackground.setSelected(category.isSelected());
    }
    

Спасибо. Возможно, это приемлемо для Android, но не работает для Xamarin.

Atlantis 17.07.2018 10:01
Ответ принят как подходящий

Вы можете создать собственный адаптер MvxRecyclerView для обработки выбора:

public class MyRecyclerAdapter : MvvmCross.Droid.Support.V7.RecyclerView.MvxRecyclerAdapter
{
    public MyRecyclerAdapter(IMvxAndroidBindingContext bindingContext) : base(bindingContext)
    {
    }

    public MyRecyclerAdapter(IntPtr javaReference, JniHandleOwnership transfer) : base(javaReference, transfer)
    {
    }

    public override void OnBindViewHolder(RecyclerView.ViewHolder holder, int position)
    {
        base.OnBindViewHolder(holder, position);
        holder.ItemView.Selected = _selectedPosition == position;
        holder.ItemView.Click += (s, e) => SelectIndex(holder.AdapterPosition);
    }

    private void SelectIndex(int index)
    {
        NotifyItemChanged(_selectedPosition);
        _selectedPosition = index;
        NotifyItemChanged(_selectedPosition);
    }

    private int _selectedPosition = RecyclerView.NoPosition;
}

Затем вы хотите установить свойство MvxRecyclerView.Adapter где-нибудь в вашем представлении. Идеальным местом обычно является OnCreate для активности или OnCreateView для фрагмента:

recyclerView.Adapter = new MyRecyclerAdapter((IMvxAndroidBindingContext)BindingContext);

На этом этапе у вас есть RecyclerView, который устанавливает выбранный элемент, на который вы нажимаете. Теперь вы можете использовать ColorStateList для изменения цвета в зависимости от состояния выбора. Добавьте файл в Resources \ drawable \ selector_category_item.xml:

<?xml version = "1.0" encoding = "utf-8" ?>
<selector xmlns:android = "http://schemas.android.com/apk/res/android">
  <item 
    android:drawable = "@color/colorAccent"
    android:state_pressed = "true" />
  <item 
    android:drawable = "@color/colorPrimary"
    android:state_selected = "true" />
</selector>

Наконец, установите фон category_item.xml LinearLayout на:

android:background = "@drawable/selector_category_item"

Стоит отметить, что вы также можете использовать другой ColorStateList для изменения android:textColor по желанию на основе состояния выбора. Вам просто нужно поместить эти XML-файлы ColorStateList в папку Resources \ color вместо Resources \ drawable.

Выложил рабочий образец на GitHub.

Куда и как следует вызывать SelectIndex (int index)?

Atlantis 17.07.2018 22:16

SelectIndex показывает, как программно выбрать элемент в адаптере RecyclerView по индексу. Это полезно, если вы хотите выбрать элемент в представлении, например, из модели представления. Если вас интересует только выбор последнего нажатого элемента, вам не нужен метод SelectIndex. Я включил его, чтобы показать, что вы должны вызывать NotifyItemChanged как для старого, так и для нового выбора при программном выборе элемента.

Trevor Balcom 17.07.2018 22:22

Понятно, я реализовал вашу часть кода, и она не работает. Если я установил точку останова на Holder.ItemView.Selected = _selectedPosition == position; и установите значение _selectedPosition равным положению, которое работает, любые другие клики - нет.

Atlantis 17.07.2018 22:32

Я отредактировал сообщение с помощью слегка измененного MyRecyclerAdapter, который выбирает элемент, по которому щелкнули последний раз. В предыдущем примере свойство Selected было установлено правильно, но вызовы NotifyItemChanged отсутствовали, поэтому вы не видели обновления в пользовательском интерфейсе после щелчка.

Trevor Balcom 18.07.2018 19:18

Привет, Тревор. Спасибо за вашу помощь. Я внес изменения в ur, и, знаете, он мигает, когда я нажимаю на элемент, но цвет не фиксируется.

Atlantis 19.07.2018 07:28

Если вы используете исходный селектор, который вы опубликовали, вероятно, проблема в этом. У вас нет цвета для android:state_selected.

Trevor Balcom 19.07.2018 15:48

Нет, я скопировал селектор, который вы мне предоставили. И он просто мигает

Atlantis 19.07.2018 17:39

Другие вопросы по теме