Как обновить / перерисовать только дополнительные представления в uicollectionview?

#ios #xamarin.ios #uicollectionview

#iOS #xamarin.ios #uicollectionview

Вопрос:

Возможно ли обновить или перерисовать только дополнительные представления в UICollectionView? У меня есть сценарий, в котором я буду обновлять каждый раздел вставкой / удалением строк, на основе которого мне нужно обновить заголовок раздела или так называемые дополнительные представления (в нем есть элемент пользовательского интерфейса, видимость которого зависит от количества элементов в этом разделе). Итак, есть ли какой-либо способ обновить дополнительные представления UICollectionView без необходимости обновлять что-либо еще?

Кроме того, если конкретный раздел не содержит никаких данных, мне нужно сделать размер дополнительного представления пустым?

Дополнительный просмотр:

 using System;
using System.Collections.Generic;
using Foundation;
using IpcCommon;
using IpcCommon.Enumerations;
using IpcCommon.Model;
using ObjCRuntime;
using UIKit;

namespace ipc_offline_app.iOS.Portal.CustomCells.Dashboard.Redesign
{
    public partial class DashboardHeader : UICollectionReusableView
    {
        public static readonly NSString Key = new NSString("DashboardHeader");
        public static readonly UINib Nib;

        private DashCategories _dashboardCategory;
        private bool _hideViewAll;
        private IShelfItemClickListener _listener;
        private string _title;

        static DashboardHeader()
        {
            Nib = UINib.FromName("DashboardHeader", NSBundle.MainBundle);
        }

        protected DashboardHeader(IntPtr handle) : base(handle)
        {
            // Note: this .ctor should not contain any initialization logic.
        }

        public static DashboardHeader CreateCell()
        {
            var array = NSBundle.MainBundle.LoadNib("DashboardHeader", null, null);
            var cell = Runtime.GetNSObject<DashboardHeader>(array.ValueAt(0));
            return cell;
        }

        public void PopulateCell(string title, IShelfItemClickListener listener, bool hideViewAll, DashCategories category = DashCategories.NONE)
        {
            _title = title;
            _dashboardCategory = category;
            _listener = listener;
            ViewAllButton.Hidden = hideViewAll;
            _hideViewAll = hideViewAll;
            TitleButton.SetTitle(_title, UIControlState.Normal);
            UpdateViewAllVisibility();
        }

        [Export("awakeFromNib")]
        public new void AwakeFromNib()
        {
            ViewAllButton.Layer.CornerRadius = 5;
            ViewAllButton.Layer.BorderWidth = 1;
            ViewAllButton.Layer.BorderColor = Utils.ColorFromHex(Colors.SILVER).CGColor;
        }

        partial void OpenSection(NSObject sender)
        {
            if (_listener != null amp;amp; _dashboardCategory != DashCategories.NONE)
                _listener.OnShelfItemClicked(_dashboardCategory, IpcCommon.Constants.VIEW_TYPE_GALLERY);
        }

        public void UpdateViewAllVisibility(Dictionary<DashCategories, List<Assignment>> filteredAssignments = null)
        {
            if (filteredAssignments != null amp;amp; filteredAssignments[_dashboardCategory].Count > IpcCommon.Constants.MAX_SECTION_ITEMS)
                _hideViewAll = false;
            ViewAllButton.Hidden = _hideViewAll;
            NSLayoutConstraint trailingConstraint;
            if (_hideViewAll)
                trailingConstraint = NSLayoutConstraint.Create(TitleButton, NSLayoutAttribute.Trailing, NSLayoutRelation.Equal, ViewAllButton, NSLayoutAttribute.Trailing, 1, 0);
            else
                trailingConstraint = NSLayoutConstraint.Create(TitleButton, NSLayoutAttribute.Trailing, NSLayoutRelation.Equal, ViewAllButton, NSLayoutAttribute.Leading, 1, -10);
            AddConstraint(trailingConstraint);
            LayoutIfNeeded();
            LayoutSubviews();
        }
    }
}
  

Комментарии:

1. Есть ли что-нибудь вроде CollectionView.ReloadItems для перезагрузки supplementaryview?

Ответ №1:

Решение:

Вы можете получить ссылку на каждое видимое дополнительное представление того раздела, в который вы вставляете / удаляете данные.

Я не вижу вашего кода, вы должны знать, indexPath из section которого вы вставляете / удаляете данные.

Например:

    // indexP here is an example
   NSIndexPath indexP = NSIndexPath.FromRowSection(0,0);         
   Header supplementaryView = CollectionView.GetSupplementaryView(myelementkind, indexP) as Header;

   //perform your own action here    
   supplementaryView.checkvisibility();
  

Комментарии:

1. Привет, я обновил вопрос. Дело в том, что данные могут быть добавлены или удалены из раздела, и если в разделе в сценарии нет данных, нам нужно скрыть сам заголовок раздела, т. Е. Размер ссылки заголовка должен быть пустым, и позже, если мы добавим данные, они должны быть снова показаны

2. @MidhunKumar Вам следует переопределить этот метод getreferencesizeforheader , чтобы изменить высоту заголовка на 0, чтобы скрыть заголовок.

3. Я уже переопределил этот метод. Дело в том, что после того, как api принесет новые данные и вставит дополнительные строки в или, скажем, удалит строки, как я инициирую вызов метода getreferencesizeforheader?

4. UICollectionvView. collectionViewLayout. invalidateLayout(); гарантирует, что будет вызван getreferencesizeforheader. Но это не приведет к повторному перерисовыванию представления. Возможно, для этого, как вы предложили, мне, возможно, придется использовать метод myown

5. Также пытался вызвать другой метод, но безрезультатно. Обновлен рассматриваемый класс. Аналогично reloadItem, есть ли что-нибудь, что мы можем вызвать для обновления siupplementaryView?