我正在创建一个应用程序,并且在该应用程序中,我使用recycleview创建了一个图像网格。第一项显示当前用户的照片,而其他图像显示其他用户的图像。为了为第一个项目设置正确的图像,我使用了可变计数。如果count == 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;
}
}
答案 0 :(得分:0)
您应该将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);
}