Mvvmcross Android - утилита-утилитавика, отображающая ошибку при прокрутке - PullRequest
0 голосов
/ 25 июня 2018

Я использую 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 (смещение: 14). Состояние: 166 mvvmcross.droid.support.v7.recyclerview.MvxRecyclerView {2799f2df VFED.V .. ........ 0,0-434,530 # 7f0900f9 app: id / mvxRVList}, адаптер.

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" />
...