首页 > 解决方案 > 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" />

标签: c#xamarin.androidmvvmcross

解决方案


推荐阅读