Android “回收查看原因”;“未找到资源”;长列表中的异常

Android “回收查看原因”;“未找到资源”;长列表中的异常,android,xamarin,Android,Xamarin,我有一个OnBindViewHolder: public override void OnBindViewHolder(RecyclerView.ViewHolder holder, int position) { PlayerBalanceRecycleView view = holder as PlayerBalanceRecycleView; var item = mItems[position];

我有一个OnBindViewHolder:

public override void OnBindViewHolder(RecyclerView.ViewHolder holder, int position)
        {
            PlayerBalanceRecycleView view = holder as PlayerBalanceRecycleView;
            var item = mItems[position];

            view.Date.Text = item.CreationDate.ToString("dd/MM");
            view.Result.Text = item.Amount.ToString("N0", new CultureInfo("en-US"));
            view.Total.Text = item.Balance.ToString("N0", new CultureInfo("en-US"));



            /* Remove SessionDetailed */
            //var oldFrag = mFragmentManager.FindFragmentByTag("session_" + view.SessionDetailed.Id);
            //if (oldFrag != null) mFragmentManager.BeginTransaction().Remove(oldFrag).Commit();

            /* Create new ID and Tag */
            //var newId = Utils.GenerateViewId();
            var tag = "session_" + view.SessionDetailed.Id.ToString();
            //view.SessionDetailed.Id = newId;

            if (item.Type == PlayerBalanceItemTypes.Payment)
            {
                view.Icon.SetImageDrawable(mActivity.Resources.GetDrawable(Resource.Drawable.ic_money_medium_blue));
                view.Result.SetTextColor(mActivity.Resources.GetColor(Resource.Color.blue));
            }
            else if (item.Type == PlayerBalanceItemTypes.Session)
            {
                view.Icon.SetImageDrawable(mActivity.Resources.GetDrawable(Resource.Drawable.ic_chips_medium));
                view.Result.SetTextColor(mActivity.Resources.GetColor(Resource.Color.orange));

                var frag = new BalancePlayerSession(item);

                var trans = mFragmentManager.BeginTransaction();
                trans.Replace(view.SessionDetailed.Id, frag, tag);
                trans.Commit();

            }
            if (item.Type == PlayerBalanceItemTypes.InitialDebt)
                view.Date.Visibility = ViewStates.Invisible;

            view.SessionDetailed.Visibility = ViewStates.Gone;
        }
public override RecyclerView.ViewHolder OnCreateViewHolder(ViewGroup parent, int viewType)
        {
            View row = LayoutInflater.From(parent.Context).Inflate(Resource.Layout.balance_player_row, parent, false);
            LinearLayout mRoot = row.FindViewById<LinearLayout>(Resource.Id.layoutPlayerBalance);
            ImageView mIcon = row.FindViewById<ImageView>(Resource.Id.imageViewPlayerBalanceType);
            TextView mDate = row.FindViewById<TextView>(Resource.Id.textBalancePlayerDate);
            TextView mResult = row.FindViewById<TextView>(Resource.Id.textBalancePlayerResult);
            TextView mTotal = row.FindViewById<TextView>(Resource.Id.textBalancePlayerTotal);
            LinearLayout mSessionDetailed = row.FindViewById<LinearLayout>(Resource.Id.layoutBalancePlayerSessionDetailed);
            mSessionDetailed.Id = Utils.GenerateViewId();

            PlayerBalanceRecycleView view = new PlayerBalanceRecycleView(row)
            {
                View = row,
                Root = mRoot,
                Icon = mIcon,
                Date = mDate,
                Result = mResult,
                Total = mTotal,
                SessionDetailed = mSessionDetailed
            };

            view.SetClickListener(OnClick);

            return view;
        }
所有ID都是唯一的,并在OnCreateViewHolder中设置。在较短的列表中(不超出屏幕范围的列表)效果很好。但是,当列表超出屏幕时,它会导致“资源未找到”异常,并引用我设置的唯一ID

似乎没有创建实际视图(以便您可以“按需”滚动)

OnCreateViewHolder:

public override void OnBindViewHolder(RecyclerView.ViewHolder holder, int position)
        {
            PlayerBalanceRecycleView view = holder as PlayerBalanceRecycleView;
            var item = mItems[position];

            view.Date.Text = item.CreationDate.ToString("dd/MM");
            view.Result.Text = item.Amount.ToString("N0", new CultureInfo("en-US"));
            view.Total.Text = item.Balance.ToString("N0", new CultureInfo("en-US"));



            /* Remove SessionDetailed */
            //var oldFrag = mFragmentManager.FindFragmentByTag("session_" + view.SessionDetailed.Id);
            //if (oldFrag != null) mFragmentManager.BeginTransaction().Remove(oldFrag).Commit();

            /* Create new ID and Tag */
            //var newId = Utils.GenerateViewId();
            var tag = "session_" + view.SessionDetailed.Id.ToString();
            //view.SessionDetailed.Id = newId;

            if (item.Type == PlayerBalanceItemTypes.Payment)
            {
                view.Icon.SetImageDrawable(mActivity.Resources.GetDrawable(Resource.Drawable.ic_money_medium_blue));
                view.Result.SetTextColor(mActivity.Resources.GetColor(Resource.Color.blue));
            }
            else if (item.Type == PlayerBalanceItemTypes.Session)
            {
                view.Icon.SetImageDrawable(mActivity.Resources.GetDrawable(Resource.Drawable.ic_chips_medium));
                view.Result.SetTextColor(mActivity.Resources.GetColor(Resource.Color.orange));

                var frag = new BalancePlayerSession(item);

                var trans = mFragmentManager.BeginTransaction();
                trans.Replace(view.SessionDetailed.Id, frag, tag);
                trans.Commit();

            }
            if (item.Type == PlayerBalanceItemTypes.InitialDebt)
                view.Date.Visibility = ViewStates.Invisible;

            view.SessionDetailed.Visibility = ViewStates.Gone;
        }
public override RecyclerView.ViewHolder OnCreateViewHolder(ViewGroup parent, int viewType)
        {
            View row = LayoutInflater.From(parent.Context).Inflate(Resource.Layout.balance_player_row, parent, false);
            LinearLayout mRoot = row.FindViewById<LinearLayout>(Resource.Id.layoutPlayerBalance);
            ImageView mIcon = row.FindViewById<ImageView>(Resource.Id.imageViewPlayerBalanceType);
            TextView mDate = row.FindViewById<TextView>(Resource.Id.textBalancePlayerDate);
            TextView mResult = row.FindViewById<TextView>(Resource.Id.textBalancePlayerResult);
            TextView mTotal = row.FindViewById<TextView>(Resource.Id.textBalancePlayerTotal);
            LinearLayout mSessionDetailed = row.FindViewById<LinearLayout>(Resource.Id.layoutBalancePlayerSessionDetailed);
            mSessionDetailed.Id = Utils.GenerateViewId();

            PlayerBalanceRecycleView view = new PlayerBalanceRecycleView(row)
            {
                View = row,
                Root = mRoot,
                Icon = mIcon,
                Date = mDate,
                Result = mResult,
                Total = mTotal,
                SessionDetailed = mSessionDetailed
            };

            view.SetClickListener(OnClick);

            return view;
        }
public override RecyclerView.ViewHolder OnCreateViewHolder(视图组父级,int-viewType)
{
查看行=LayoutInflater.From(parent.Context).充气(Resource.Layout.balance\u player\u行,parent,false);
linearlayoutmroot=row.findviewbyd(Resource.Id.layoutplayerbance);
ImageView mIcon=row.FindViewById(Resource.Id.ImageViewPlayerBanceType);
TextView mDate=row.FindViewById(Resource.Id.textBalancePlayerDate);
TextView mResult=row.findviewbyd(Resource.Id.textBalancePlayerResult);
TextView mTotal=row.FindViewById(Resource.Id.textBalancePlayerTotal);
LinearLayout mSessionDetailed=row.FindViewById(Resource.Id.layoutBalancePlayerSessionDetailed);
mSessionDetailed.Id=Utils.GenerateViewId();
PlayerBalanceRecycleView视图=新的PlayerBalanceRecycleView(行)
{
视图=行,
Root=mRoot,
Icon=mIcon,
日期=mDate,
结果=mResult,
总计=总金额,
SessionDetailed=mSessionDetailed
};
view.SetClickListener(OnClick);
返回视图;
}
解释行为的视频:


如何确保片段正确地替换视图?

请包含一个示例项目,用两个屏幕截图演示问题的行为@谢谢你的评论。我添加了一个视频链接,显示发生了什么。对于第一个用户,它按预期工作,但对于列表比屏幕长的第二个用户,它不起作用。我将创建一个样本项目以及上传。