Как установить фон выбранного элемента в 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>
Мне нужно изменить фон выбранного элемента на другой, пока элемент выбран. Как я могу разобраться?
Category model.viewHolder создайте экземпляр для корневого представления элемента ресайклера mBackground.На 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());
}
Вы можете создать собственный адаптер 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)?
SelectIndex показывает, как программно выбрать элемент в адаптере RecyclerView по индексу. Это полезно, если вы хотите выбрать элемент в представлении, например, из модели представления. Если вас интересует только выбор последнего нажатого элемента, вам не нужен метод SelectIndex. Я включил его, чтобы показать, что вы должны вызывать NotifyItemChanged как для старого, так и для нового выбора при программном выборе элемента.
Понятно, я реализовал вашу часть кода, и она не работает. Если я установил точку останова на Holder.ItemView.Selected = _selectedPosition == position; и установите значение _selectedPosition равным положению, которое работает, любые другие клики - нет.
Я отредактировал сообщение с помощью слегка измененного MyRecyclerAdapter, который выбирает элемент, по которому щелкнули последний раз. В предыдущем примере свойство Selected было установлено правильно, но вызовы NotifyItemChanged отсутствовали, поэтому вы не видели обновления в пользовательском интерфейсе после щелчка.
Привет, Тревор. Спасибо за вашу помощь. Я внес изменения в ur, и, знаете, он мигает, когда я нажимаю на элемент, но цвет не фиксируется.
Если вы используете исходный селектор, который вы опубликовали, вероятно, проблема в этом. У вас нет цвета для android:state_selected.
Нет, я скопировал селектор, который вы мне предоставили. И он просто мигает
Спасибо. Возможно, это приемлемо для Android, но не работает для Xamarin.