Android “回收查看原因”;“未找到资源”;长列表中的异常
我有一个OnBindViewHolder:Android “回收查看原因”;“未找到资源”;长列表中的异常,android,xamarin,Android,Xamarin,我有一个OnBindViewHolder: public override void OnBindViewHolder(RecyclerView.ViewHolder holder, int position) { PlayerBalanceRecycleView view = holder as PlayerBalanceRecycleView; var item = mItems[position];
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);
返回视图;
}
解释行为的视频:
如何确保片段正确地替换视图?请包含一个示例项目,用两个屏幕截图演示问题的行为@谢谢你的评论。我添加了一个视频链接,显示发生了什么。对于第一个用户,它按预期工作,但对于列表比屏幕长的第二个用户,它不起作用。我将创建一个样本项目以及上传。