Запретить повторное использование первого представления элемента в сетке RecycleView с пользователем SetTag / GetTag при прокрутке - PullRequest
0 голосов
/ 06 ноября 2018

Я создаю приложение, и в этом приложении я создал сетку изображений с recycleview. Первый элемент отображает фотографию текущего пользователя, в то время как другие изображения отображают изображения других пользователей. Чтобы установить правильное изображение для первого элемента, я использую переменную count. Если 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 голосов
/ 06 ноября 2018

Вы должны уменьшить OnCreateViewHolder до простого создания экземпляра, настроить это представление и вернуть ViewHolder, а затем обработать привязку в переопределении OnBindViewHolder, чтобы у вас был стабильный идентификатор для обработки.

Что-то вроде:

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);
}
...