我正在创建一个应用程序,在这个应用程序中,我使用recycleview创建了一个图像网格。第一个项目显示当前用户的照片,而其他图像显示其他用户的图像。为了设置第一个项目的正确图像,我使用了一个变量计数。如果计数==0,则设置正确的图像。不幸的是,当网格滚动到默认的背景资源图像时,加载的第一个项目图像会发生更改。当然,这是由于ItemViewHolder对视图的重用。所以我的问题是,当网格滚动时,我如何在第一个项目中保持正确的图像。从我目前的研究来看,SetTag/GetTag可能有效。然而,我不确定在这种情况下使用它。如有任何帮助,我们将不胜感激。
public override RecyclerView.ViewHolder OnCreateViewHolder(ViewGroup parent, int viewType)
{
try
{
View itemview = LayoutInflater.From(parent.Context).Inflate(Resource.Layout.Search_item_layout_local, parent, false);
ItemViewHolder ivh = new ItemViewHolder(itemview, OnClick);
ISharedPreferences iSharedPref = PreferenceManager.GetDefaultSharedPreferences(itemview.Context);
ISharedPreferencesEditor iSharedPrefEditor = iSharedPref.Edit();
var genImage = itemview.FindViewById<SquareImageView>(Resource.Id.grid_item_image);
var count = ii++;
if (count == 0)
{
string image = string.Empty;
if (iSharedPref.GetString("Gender", "Male").ToString() == "Female")
{
genImage.SetBackgroundResource(Resource.Mipmap.Female);
}
else
{
genImage.SetBackgroundResource(Resource.Mipmap.Male);
ivh._ProfileImage.SetTag(Resource.Mipmap.Male, count);
}
}
else
{
if (iSharedPref.GetString("Seeking", "Female").ToString() == "Female")
{
genImage.SetBackgroundResource(Resource.Mipmap.Female);
}
else
{
genImage.SetBackgroundResource(Resource.Mipmap.Male);
}
}
return ivh;
}
catch (Exception ex)
{
FirebaseCrash.Report(ex);
return null;
}
}
您应该将OnCreateViewHolder
简化为实例化,设置视图并返回ViewHolder
,然后在OnBindViewHolder
覆盖中处理绑定,这样您就有了一个稳定的ID来执行操作。
类似于:
public override RecyclerView.ViewHolder OnCreateViewHolder(ViewGroup parent, int viewType)
{
var itemView = LayoutInflater.From(parent.Context).Inflate(Resource.Layout.app_info, parent, false);
return new ItemViewHolder(itemview); // "OnClick" should be added in the OnBindViewHolder and removed in the OnViewRecycled
}
现在,在OnBindViewHolder
中,传递了一个稳定的position
值,您可以对其进行操作(在您的情况下,零的位置是一种特殊情况(。在这个覆盖中,您将处理为ViewHolder赋值、添加侦听器/事件处理程序等。:
public override void OnBindViewHolder(RecyclerView.ViewHolder holder, int position)
{
var viewHolder = holder as ItemViewHolder;
if (position == 0)
{
~~~
}
else
{
~~~
}
}
在OnViewRecycled
覆盖中,删除所有侦听器/事件处理程序等,以防止内存泄漏等。
public override void OnViewRecycled(Java.Lang.Object holder)
{
var viewHolder = holder as ItemViewHolder;
~~~
base.OnViewRecycled(holder);
}