防止滚动时使用SetTag / GetTag的用户重复使用RecycleView网格中的第一项视图

时间:2018-11-06 06:55:34

标签: android xamarin android-recyclerview xamarin.android android-viewholder

我正在创建一个应用程序,并且在该应用程序中,我使用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;
        }
    }

1 个答案:

答案 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);
}