c# - Mvvmcross Android - recyclerview 自定义适配器在滚动时抛出错误
问题描述
我正在将 mvvmcross 用于 xamarin android 应用程序。在这个应用程序中,我使用 MvxRecyclerView 并为其创建了自定义适配器。
在活动中,我将此适配器绑定到回收器视图,如下所示 -
protected override void OnCreate(Bundle bundle)
{
base.OnCreate(bundle);
recyclerview = (MvxRecyclerView)FindViewById(Resource.Id.mvxRVList);
GridLayoutManager gridLayoutManager = new GridLayoutManager(this, 3);
LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this);
recyclerview.SetLayoutManager(isLandscape ? (LinearLayoutManager)linearLayoutManager : gridLayoutManager);
globalRetailItemAdapter = new CustomAdapter(isLandscape, this, (IMvxAndroidBindingContext)BindingContext);
recyclerview.NestedScrollingEnabled = true;
}
适配器 :
public class CustomAdapter : MvxRecyclerAdapter //,ISectionIndexer
{
Context context;
bool isLandscape;
public CustomAdapter(bool isLandscape, Context context, IMvxAndroidBindingContext bindingContext)
: base(bindingContext)
{
this.context = context;
this.isLandscape = isLandscape;
}
public override ViewHolder OnCreateViewHolder(ViewGroup parent, int viewType)
{
View itemView;
if (viewType == 0)
{
itemView = LayoutInflater.From(parent.Context).Inflate(Resource.Layout.sectionHeaderTemplate,parent,false);
return new ItemViewHolderForHeader(itemView, this.BindingContext);
}
else
{
itemView = LayoutInflater.From(parent.Context).Inflate(Resource.Layout.productlistviewitem, parent, false);
return new ItemViewHolder(itemView, this.BindingContext);
}
}
public override int GetItemViewType(int position)
{
var item = GetItem(position);
if (item is RetailItemSectionHeader)
return 0;
return 1;
}
public override void OnBindViewHolder(ViewHolder holder, int position)
{
try
{
int type = GetItemViewType(position);
var item = GetItem(position);
if (type == 0)
{
RetailItemSectionHeader header = (RetailItemSectionHeader)item;//items[position]
ItemViewHolderForHeader viewHolder = (ItemViewHolderForHeader)holder;
viewHolder.tvItemPrice.Text = header.headerTitle;
}
else
{
RetailItem retailItem = (RetailItem)item;//items[position]
ItemViewHolder viewHolder = (ItemViewHolder)holder;
viewHolder.tvProductItemName.Text = retailItem.Title;
viewHolder.tvItemQuantity.Text = Convert.ToString(retailItem.quantity);
viewHolder.tvItemPrice.Text = Convert.ToString(retailItem.Price);
}
}
catch(Exception e)
{
}
}
}
观众:
public class ItemViewHolder : MvxRecyclerViewHolder
{
public TextView tvProductItemName, tvItemPrice, tvItemQuantity;
public LinearLayout llTemplate;
public RelativeLayout rlTemplate;
public ItemViewHolder(View itemView, IMvxAndroidBindingContext context)
: base(itemView, context)
{
tvProductItemName = (TextView)itemView.FindViewById(Resource.Id.tvProductItemName);
tvItemPrice = (TextView)itemView.FindViewById(Resource.Id.tvItemPrice);
tvItemQuantity = (TextView)itemView.FindViewById(Resource.Id.tvItemQuantity);
llTemplate = (LinearLayout)itemView.FindViewById(Resource.Id.lvItemTemplate);
rlTemplate = (RelativeLayout)itemView.FindViewById(Resource.Id.rlItemTemplate);
}
}
public class ItemViewHolderForHeader : MvxRecyclerViewHolder
{
public TextView tvItemPrice;
public ItemViewHolderForHeader(View itemView, IMvxAndroidBindingContext context)
: base(itemView, context)
{
tvItemPrice = (TextView)itemView.FindViewById(Resource.Id.tvItemPrice);
}
}
我的视图正在正确呈现,但是当我尝试在列表上滚动时出现错误。以下是我得到的错误描述 -
未处理的异常:
Java.Lang.IndexOutOfBoundsException:检测到不一致。无效项目位置 14(offset:14).state:166 mvvmcross.droid.support.v7.recyclerview.MvxRecyclerView{2799f2df VFED.V.. ........ 0,0-434,530 #7f0900f9 app:id/ mvxRVList},适配器:md569c8f30ad557d7c02673e279425d47a7.CustomAdapter@29fb04f0,布局:android.support.v7.widget.GridLayoutManager@111878a2,上下文:md5a2c5b2e78f64efe650e82df8fe55ec57.HomeView@2c4705d
布局文件中的 Recyclerview -
<MvvmCross.Droid.Support.V7.RecyclerView.MvxRecyclerView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingLeft="10dp"
android:background="@android:color/transparent"
android:paddingTop="15dp"
android:scrollbars="vertical"
android:scrollbarSize="20dp"
android:scrollbarStyle="outsideInset"
local:MvxBind="ItemsSource ItemsWithHeader;ItemClick ItemSelectedCommand"
local:MvxTemplateSelector="RMH.POS.Mobile.Android.ProductListTemplateSelector,RMH.POS.Mobile.Android"
android:id="@+id/mvxRV" />
解决方案
推荐阅读
- vb.net - 选择消息框图标时出现消息框错误 vb.net
- php - Check values inside a foreach loop
- python - 如何从 python 脚本中抑制特定警告?
- kubernetes - docker-for-windows 提供的 k8s 集群出现“VolumeFailedDelete”错误
- python-3.x - python3中将csv文件解析并组合成另一个csv文件
- integration - 如何在 WordPress 中集成 SagePay
- java - 如何比较两个不同数据库用户之间的架构?
- ruby-on-rails - 有没有办法将属性放在 MongoDB 文档中的特定位置?
- php - 如何将 Wordpress 文件放在 Laravel 根目录中,以便 URL 显示为 laravel 和 wordpress 中给出的“www.domain.com/url”
- laravel - laravel 路由分组方式,带动态子域和不带子域