如何为MvxListView实现交替行背景图片?
给MvxListView实现交替行背景的实用方案
嘿,作为刚入坑Xamarin Android和MvvmCross的新手,想要给MvxListView加上交替行背景效果其实没那么复杂,我给你整理了几个可行的方案,你可以根据自己的需求来选:
方案1:自定义MvxAdapter(最灵活的方式)
MvxListView默认用的是MvxAdapter,我们可以继承它并重写GetView方法,在绑定数据时根据行的位置直接设置背景色:
- 先写一个自定义的Adapter类:
public class AlternateRowAdapter : MvxAdapter { private readonly int _evenColor; private readonly int _oddColor; public AlternateRowAdapter(Context context, IMvxAndroidBindingContext bindingContext) : base(context, bindingContext) { // 从资源文件里取你想要的两种背景色 _evenColor = Context.Resources.GetColor(Resource.Color.even_row_bg); _oddColor = Context.Resources.GetColor(Resource.Color.odd_row_bg); } public override View GetView(int position, View convertView, ViewGroup parent) { var rowView = base.GetView(position, convertView, parent); // 奇数行和偶数行设置不同背景 rowView.SetBackgroundColor(position % 2 == 0 ? _evenColor : _oddColor); return rowView; } }
- 在你的Activity/Fragment里给MvxListView设置这个Adapter:
var myListView = FindViewById<MvxListView>(Resource.Id.your_listview_id); myListView.Adapter = new AlternateRowAdapter(this, this.BindingContext);
方案2:通过Item模板的绑定实现
如果你不想自定义Adapter,也可以在Item的布局文件里结合ViewModel的位置属性来绑定背景:
- 先给你的Item ViewModel加一个
Position属性:
public class YourItemViewModel : MvxViewModel { // 你的其他业务属性... public int Position { get; set; } }
- 在填充Items集合的时候,给每个Item赋值Position:
// 假设你的Items是ObservableCollection<YourItemViewModel>类型 for (int i = 0; i < Items.Count; i++) { Items[i].Position = i; }
- 最后在Item的布局文件里绑定背景色:
<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" local:MvxBind="BackgroundColor Position % 2 == 0 ? @color/even_row_bg : @color/odd_row_bg"> <!-- 这里放你的Item内容控件,比如TextView、ImageView等 --> </LinearLayout>
方案3:用Android Drawable Selector(静态样式)
如果你的交替背景是固定的纯色或简单样式,也可以用Drawable来实现:
- 先在
Resources/drawable下创建两个背景文件:row_even_bg.xml:
<shape xmlns:android="http://schemas.android.com/apk/res/android"> <solid android:color="@color/even_row_bg" /> </shape>
row_odd_bg.xml:
<shape xmlns:android="http://schemas.android.com/apk/res/android"> <solid android:color="@color/odd_row_bg" /> </shape>
- 然后在自定义Adapter的
GetView方法里设置背景资源:
public override View GetView(int position, View convertView, ViewGroup parent) { var rowView = base.GetView(position, convertView, parent); var bgResId = position % 2 == 0 ? Resource.Drawable.row_even_bg : Resource.Drawable.row_odd_bg; rowView.SetBackgroundResource(bgResId); return rowView; }
额外注意点
- 别忘了在
Resources/values/colors.xml里定义你要用的颜色:
<color name="even_row_bg">#f5f5f5</color> <color name="odd_row_bg">#ffffff</color>
- 你代码里已经加了
android:cacheColorHint="@android:color/transparent",这个设置很好,能避免ListView滚动时的背景闪烁问题,记得保留。
内容的提问来源于stack exchange,提问作者Nadeem Shaikh
相关产品推荐
相关产品推荐

