Android Xamarin С# NotifyDataSetChanged из RecyclerView не работает с фрагментом ⇐ Android
Android Xamarin С# NotifyDataSetChanged из RecyclerView не работает с фрагментом
У меня есть инвентарь (созданный мною собственный класс), который я пытаюсь отобразить. Он отображается хорошо, но когда я пытаюсь обновить содержимое и обновить представление, это не работает после замены фрагмента назад и четвертого. (Я имею в виду, что при первом отображении фрагмента инвентарь обновляется нормально. Но после того как я заменил фрагмент на другой фрагмент и обратно, он уже не работает).
Класс Inventory:
с использованием MineClick.EventSystem; использование MineClick.EventSystem.EventArguments; использование MineClick.Материалы; использование MineClick.PlayerStorage; использование MineClick.PlayerStorage.InventoryItems; использование системы; использование System.Collections.Generic; используя System.Linq; использование статического MineClick.EventSystem.EventManager; пространство имен MineClick { внутренний класс Inventory { protected List Items {get; } публичный инвентарь (инвентарь инв) { Предметы = новый список(); Add(true,inv.GetItems().ToArray()); } публичный инвентарь() { Предметы = новый список(); } public void Add(params Item[] items) { Добавить (ложь, элементы); } public void Add(bool quiet, params Item[] items) { foreach (элемент var в элементах) Добавить (пункт, правда); если (!молчать) { EventManager.InvokeEvent(Events.ADDED_ITEMS_TO_INVENTORY, новый EA_ADDED_ITEMS_TO_INVENTORY(this, items.ToList())); EventManager.InvokeEvent(Events.INVENTORY_CHANGED, новый EA_INVENTORY_CHANGE(this)); } } Private void Add (элемент InventoryItem) { Предметы.Добавить(пункт); } public void Add (элемент элемента) { Добавить (пункт, ложь); } public void Add (элемент элемента, bool Silent) { if (!(Contains(item) && GetItem(item).OnSameItemAdded(item, this))) Добавить(InventoryItemBinder.GetInventoryItemForItem(пункт)); если (молчит) возвращаться; EventManager.InvokeEvent(Events.ADDED_ITEMS_TO_INVENTORY, новый EA_ADDED_ITEMS_TO_INVENTORY(this, new List() { item })); EventManager.InvokeEvent(Events.INVENTORY_CHANGED, новый EA_INVENTORY_CHANGE(this)); } public InventoryItem GetItem (предмет предмета) { return Items.Find(x => x.GetItem().Id.Equals(item.Id)); } общедоступный виртуальный элемент Get (идентификатор строки) { foreach (элемент InventoryItem в Items) если (item.GetItem().Id.Equals(id)) вернуть элемент.GetItem(); вернуть ноль; } общедоступный виртуальный элемент Get (предмет предмета) { вернуть Get(item.Id); } общедоступный виртуальный элемент Get (int pos) { вернуть Items.ElementAt(pos).GetItem(); } общедоступный виртуальный список GetItems() { return Items.ConvertAll(x => x.GetItem()); } public virtual bool Содержит (идентификатор строки) { вернуть Get(id) != null; } public virtual bool Содержит (элемент элемента) { возврат Содержит (item.Id); } общедоступный виртуальный размер int() { вернуть Предметы.Количество; } Публичный виртуальный элемент Remove (int pos) { Item item = Get(pos); если (пункт != ноль) Items.RemoveAt(pos); вернуть изделие; } Удаление общедоступного виртуального элемента (идентификатор строки) { Элемент элемента = Получить (идентификатор); если (пункт != ноль) Items.Remove(GetItem(элемент)); вернуть изделие; } Публичный виртуальный элемент Удалить (элемент элемента) { вернуть Удалить (item.Id); } общественная недействительность Очистить() { Предметы.Очистить(); } публичный виртуальный клон инвентаря() { Инвентарь inv = новый инвентарь(); foreach (элемент элемента в GetItems()) { inv.Add(элемент); } вернуть инв; } } } Вот адаптер инвентаря:
с использованием Android.App; использование Android.Content; использование Android.Графика; использование Android.OS; использование Android.Runtime; использование Android.Util; использование Android.Views; с помощью Android.Виджет; использование AndroidX.RecyclerView.Widget; использование MineClick.Материалы; использование системы; использование System.Collections.Generic; используя System.Linq; использование System.Text; использование статического MineClick.InventoryView; пространство имен MineClick { внутренний класс InventoryAdapter: RecyclerView.Adapter { публичный контейнер инвентаря {get; защищенный набор; } общественный список InvItems {get; защищенный набор; } общественное переопределение int ItemCount {get; } public Action OnClickActions {get; набор; } public InventoryAdapter (Inventory inv, int size): base() { InvItems = новый список(); Контейнер = инв; ItemCount = размер; // Container.OnMaterialAmountModified += (идентификатор строки, длинная сумма) => OnItemChange(количество, идентификатор); // Container.OnNewMaterialAdded += (идентификатор строки) => OnItemChange(Container.Get(id).Amount, id); } общедоступное переопределение void OnBindViewHolder (держатель RecyclerView.ViewHolder, позиция int) { ViewHolder view = (ViewHolder) держатель; if(Container.Size() > позиция) { view.Icon.DisplayedItem = Container.GetItem(Container.Get(position)); } } public void OnItemChange (длинная сумма, идентификатор строки) { если (сумма == 0) Container.Remove(id); УведомитьDataSetChanged(); } общедоступное переопределение RecyclerView.ViewHolder OnCreateViewHolder (родительский элемент ViewGroup, int viewType) { Значок InventorySlotView = новый InventorySlotView(parent.Context); InvItems.Add(значок); icon.Click += (e, s) => OnClickActions.Invoke(new InventoryClickEvent(icon,InvItems)); вернуть новый ViewHolder (значок); } публичное переопределение long GetItemId (int Position) { возвратное положение; } публичное переопределение int GetItemViewType (положение int) { возвратное положение; } внутренний класс ViewHolder: RecyclerView.ViewHolder { общедоступный значок InventorySlotView; public ViewHolder (View itemView): база (itemView) { Значок = (InventorySlotView)itemView; } } } } Класс InventoryView: (EventManager — это созданная мной пользовательская система событий, инвентарь запускает событие глобального изменения)
с использованием Android.App; использование Android.Content; использование Android.OS; использование Android.Runtime; использование Android.Util; использование Android.Views; с помощью Android.Виджет; использование AndroidX.RecyclerView.Widget; использование MineClick.EventSystem; использование MineClick.EventSystem.EventArguments; использование MineClick.Материалы; с помощью MineClick.Utility; использование системы; использование System.Collections.Generic; используя System.Linq; использование System.Text; использование статического MineClick.EventSystem.EventManager; пространство имен MineClick { внутренний класс InventoryView: LinearLayout { частный статический только для чтения int SIZE = 80; личный инвентарь инвентарь {get; набор; } частное Action _onClickActions {get; набор; } public Action OnClickActions {get => _onClickActions; установить {_onClickActions = значение; Адаптер.OnClickActions = значение; } } частный адаптер InventoryAdapter {get; набор; } общественный InventorySlotView _selected {получить; набор; } общественный InventorySlotView SelectedItem {get => _selected; set { if(_selected!= null) _selected.Higlighted = false; _selected = значение; if(value!= null) value.Higlighted = true; } } public InventoryView (контекст контекста, Inventory inv, действия Action): база (контекст) { this.inventory = инв; _onClickActions = DefaultClickEventAction + действия; EventManager.BindListener(Events.INVENTORY_CHANGED,HandleInventoryChangeEvent); Инициализировать(); } public InventoryView (контекст контекста, инвентарь inv): this (context, inv, null) { } Private void HandleInventoryChangeEvent (отправитель объекта, EA_INVENTORY_CHANGE args) { if (args.ChangedInventory == инвентарь) Обновлять(); } public void SetSelected (элемент элемента) { если (пункт == ноль) возвращаться; SelectedItem = Adaptor.InvItems.Find(x => x.DisplayedItem != null && x.DisplayedItem.GetItem().Id == item.Id); } частная пустота Инициализация() { LayoutParameters = новые LayoutParams (LayoutParams.MatchParent, LayoutParams.MatchParent); Ориентация = Ориентация.Вертикально; RecyclerView recyclerView = новый RecyclerView(Контекст); RecyclerView.LayoutParams recyclerParams = новый RecyclerView.LayoutParams(ViewGroup.LayoutParams.MatchParent, ViewGroup.LayoutParams.WrapContent); int columns = Math.Max(1, ConstantsApplication.AppWidth / ConstantsApplication.SlotSize); int size = Inventory.Size() > РАЗМЕР ? инвентарь.Размер() : РАЗМЕР; размер += столбцы - размер столбцов %; Адаптер = новый InventoryAdapter (инвентарь, размер); Адаптер.OnClickActions = OnClickActions; Менеджер GridLayoutManager = новый GridLayoutManager (Контекст, столбцы); Manager.Orientation = (int) Orientation.Vertical; recyclerView.SetLayoutManager(менеджер); recyclerView.SetAdapter(Адаптер); recyclerView.LayoutParameters = recyclerParams; AddView (RecyclerView); } публичное недействительное обновление() { Адаптер.NotifyDataSetChanged(); } частная пустота DefaultClickEventAction (InventoryClickEvent e) { bool выделено = e.ClickedItem.Higlighted; e.InventoryItems.ForEach(i => i.Higlighted = false); e.ClickedItem.Higlighted = !выделено; ВыбранныйЭлемент = e.ClickedItem; } внутренний класс InventoryClickEvent { общественный InventorySlotView ClickedItem {get; частный набор; } общественный список InventoryItems {get; } public InventoryClickEvent (InventorySlotView clickedItem, List MaterialIcons) { ClickedItem = clickedItem; InventoryItems = MaterialIcons; } } } } InventorySlotView
с использованием Android.App; использование Android.Content; использование Android.Графика; использование Android.OS; использование Android.Runtime; использование Android.Util; использование Android.Views; с помощью Android.Виджет; с помощью MineClick.Кирки; использование MineClick.PlayerStorage; использование MineClick.PlayerStorage.InventoryItems; с помощью MineClick.Utility; использование системы; использование System.Collections.Generic; используя System.Linq; использование System.Text; пространство имен MineClick.Materials { внутренний класс InventorySlotView: RelativeLayout { частный InventoryItem _item; общественный InventoryItem DisplayedItem {получить => _item; установить { _item = значение; ПриИзмененииМатериала(); } } частный bool _highlighted {получить; набор; } public bool Highlighted {get => _highlighted; установить { _highlighted = значение; Недействителен(); } } Значок просмотра; частная краска borderPaint; public InventorySlotView (контекст контекста, элемент InventoryItem = null): база (контекст) { Инициализировать(); DisplayedItem = элемент; } частная пустота Инициализация() { _highlighted = ложь; borderPaint = новая краска (); borderPaint.SetStyle(Paint.Style.Stroke); границаPaint.StrokeWidth = 10; RelativeLayout.LayoutParams layoutParams = новый RelativeLayout.LayoutParams(ConstantsApplication.SlotSize, ConstantsApplication.SlotSize); Параметры макета = Параметры макета; SetBackgroundColor(Color.DarkGray); Иницикон(); } частная пустота InitIcon() { если (Значок != ноль) УдалитьВид(Значок); если (DisplayedItem! = ноль) { Значок = DisplayedItem.GetDisplayIcon(Контекст); RelativeLayout.LayoutParams imageParams = новый RelativeLayout.LayoutParams(LayoutParams.MatchParent, LayoutParams.MatchParent); int border = (int)borderPaint.StrokeWidth; imageParams.SetMargins(10 + граница, 10 + граница, 0 + граница, 10 + граница); Icon.LayoutParameters = imageParams; ДобавитьВид(Значок); } } частная пустота OnMaterialChange() { Иницикон(); } публичное переопределение void Draw (холст Canvas) { borderPaint.Color = _highlighted? Color.ParseColor("#3498db") : Color.Black; base.Draw(холст); холст.DrawRect(новый Rect(0,0,Width,Height),borderPaint); } } } Фрагмент:
с использованием Android.Graphics; использование Android.OS; использование Android.Views; с помощью Android.Виджет; используя AndroidX.Fragment.App; использование MineClick.Crafting.Bench; использование MineClick.Crafting.Bench.CostList; использование MineClick.EventSystem; использование MineClick.EventSystem.EventArguments; использование MineClick.Материалы; с помощью MineClick.Navigation; с помощью MineClick.Кирки; с помощью MineClick.Player; с помощью MineClick.Utility; использование статического MineClick.EventSystem.EventManager; использование статического MineClick.InventoryView; пространство имен MineClick.Crafting { внутренний класс CraftFragment: Фрагмент { CraftAdapter CraftAdapter {получить; набор; } публичное переопределение void OnCreate (Bundle saveInstanceState) { base.OnCreate(saveInstanceState); } общедоступное переопределение View OnCreateView (инфлятор LayoutInflater, контейнер ViewGroup, Bundle saveInstanceState) { Просмотр представления = inflater.Inflate(Resource.Layout.crafting_activity,Container, false); Оболочка LinearLayout = view.FindViewById[*](Resource.Id.crafting_wrraper); LinearLayout InventoryWrraper = view.FindViewById(Resource.Id.inventory_wrraper); LinearLayout CostListWrraper = view.FindViewById(Resource.Id.cost_list_wrraper); Скамейка CraftingBench = новый CraftingBench (Контекст); wrraper.AddView(скамья); InventoryView InventoryDisplay = новый InventoryView(Context, PlayerApplication.Instance.Player.PlayerInventory); InventoryWrraper.AddView(inventoryDisplay); CostListView CostList = новый CostListView (Контекст); CostListWrraper.AddView(costList); CraftAdapter = новый CraftAdapter (inventoryDisplay, скамейка, CostList); обратный вид; } } } Несколько замечаний:
notifysetdatachanged вызывается, я проверил.
[*]
Я пробовал использовать метод post обработчика, не помогло.
[*]
данные меняются, проверил.
[*]
Я пытался очистить инвентарь и добавить в него элементы, а затем вызвать notifydatasetchanged, не помогло.
[*]
обновление работает при первой инициализации фрагмента, но после повторного использования (замены) перестает обновлять представление переработчика
[*]
Прокрутка представления переработчика приводит к обновлению представления переработчика
Будем очень признательны за любую помощь!
У меня есть инвентарь (созданный мною собственный класс), который я пытаюсь отобразить. Он отображается хорошо, но когда я пытаюсь обновить содержимое и обновить представление, это не работает после замены фрагмента назад и четвертого. (Я имею в виду, что при первом отображении фрагмента инвентарь обновляется нормально. Но после того как я заменил фрагмент на другой фрагмент и обратно, он уже не работает).
Класс Inventory:
с использованием MineClick.EventSystem; использование MineClick.EventSystem.EventArguments; использование MineClick.Материалы; использование MineClick.PlayerStorage; использование MineClick.PlayerStorage.InventoryItems; использование системы; использование System.Collections.Generic; используя System.Linq; использование статического MineClick.EventSystem.EventManager; пространство имен MineClick { внутренний класс Inventory { protected List Items {get; } публичный инвентарь (инвентарь инв) { Предметы = новый список(); Add(true,inv.GetItems().ToArray()); } публичный инвентарь() { Предметы = новый список(); } public void Add(params Item[] items) { Добавить (ложь, элементы); } public void Add(bool quiet, params Item[] items) { foreach (элемент var в элементах) Добавить (пункт, правда); если (!молчать) { EventManager.InvokeEvent(Events.ADDED_ITEMS_TO_INVENTORY, новый EA_ADDED_ITEMS_TO_INVENTORY(this, items.ToList())); EventManager.InvokeEvent(Events.INVENTORY_CHANGED, новый EA_INVENTORY_CHANGE(this)); } } Private void Add (элемент InventoryItem) { Предметы.Добавить(пункт); } public void Add (элемент элемента) { Добавить (пункт, ложь); } public void Add (элемент элемента, bool Silent) { if (!(Contains(item) && GetItem(item).OnSameItemAdded(item, this))) Добавить(InventoryItemBinder.GetInventoryItemForItem(пункт)); если (молчит) возвращаться; EventManager.InvokeEvent(Events.ADDED_ITEMS_TO_INVENTORY, новый EA_ADDED_ITEMS_TO_INVENTORY(this, new List() { item })); EventManager.InvokeEvent(Events.INVENTORY_CHANGED, новый EA_INVENTORY_CHANGE(this)); } public InventoryItem GetItem (предмет предмета) { return Items.Find(x => x.GetItem().Id.Equals(item.Id)); } общедоступный виртуальный элемент Get (идентификатор строки) { foreach (элемент InventoryItem в Items) если (item.GetItem().Id.Equals(id)) вернуть элемент.GetItem(); вернуть ноль; } общедоступный виртуальный элемент Get (предмет предмета) { вернуть Get(item.Id); } общедоступный виртуальный элемент Get (int pos) { вернуть Items.ElementAt(pos).GetItem(); } общедоступный виртуальный список GetItems() { return Items.ConvertAll(x => x.GetItem()); } public virtual bool Содержит (идентификатор строки) { вернуть Get(id) != null; } public virtual bool Содержит (элемент элемента) { возврат Содержит (item.Id); } общедоступный виртуальный размер int() { вернуть Предметы.Количество; } Публичный виртуальный элемент Remove (int pos) { Item item = Get(pos); если (пункт != ноль) Items.RemoveAt(pos); вернуть изделие; } Удаление общедоступного виртуального элемента (идентификатор строки) { Элемент элемента = Получить (идентификатор); если (пункт != ноль) Items.Remove(GetItem(элемент)); вернуть изделие; } Публичный виртуальный элемент Удалить (элемент элемента) { вернуть Удалить (item.Id); } общественная недействительность Очистить() { Предметы.Очистить(); } публичный виртуальный клон инвентаря() { Инвентарь inv = новый инвентарь(); foreach (элемент элемента в GetItems()) { inv.Add(элемент); } вернуть инв; } } } Вот адаптер инвентаря:
с использованием Android.App; использование Android.Content; использование Android.Графика; использование Android.OS; использование Android.Runtime; использование Android.Util; использование Android.Views; с помощью Android.Виджет; использование AndroidX.RecyclerView.Widget; использование MineClick.Материалы; использование системы; использование System.Collections.Generic; используя System.Linq; использование System.Text; использование статического MineClick.InventoryView; пространство имен MineClick { внутренний класс InventoryAdapter: RecyclerView.Adapter { публичный контейнер инвентаря {get; защищенный набор; } общественный список InvItems {get; защищенный набор; } общественное переопределение int ItemCount {get; } public Action OnClickActions {get; набор; } public InventoryAdapter (Inventory inv, int size): base() { InvItems = новый список(); Контейнер = инв; ItemCount = размер; // Container.OnMaterialAmountModified += (идентификатор строки, длинная сумма) => OnItemChange(количество, идентификатор); // Container.OnNewMaterialAdded += (идентификатор строки) => OnItemChange(Container.Get(id).Amount, id); } общедоступное переопределение void OnBindViewHolder (держатель RecyclerView.ViewHolder, позиция int) { ViewHolder view = (ViewHolder) держатель; if(Container.Size() > позиция) { view.Icon.DisplayedItem = Container.GetItem(Container.Get(position)); } } public void OnItemChange (длинная сумма, идентификатор строки) { если (сумма == 0) Container.Remove(id); УведомитьDataSetChanged(); } общедоступное переопределение RecyclerView.ViewHolder OnCreateViewHolder (родительский элемент ViewGroup, int viewType) { Значок InventorySlotView = новый InventorySlotView(parent.Context); InvItems.Add(значок); icon.Click += (e, s) => OnClickActions.Invoke(new InventoryClickEvent(icon,InvItems)); вернуть новый ViewHolder (значок); } публичное переопределение long GetItemId (int Position) { возвратное положение; } публичное переопределение int GetItemViewType (положение int) { возвратное положение; } внутренний класс ViewHolder: RecyclerView.ViewHolder { общедоступный значок InventorySlotView; public ViewHolder (View itemView): база (itemView) { Значок = (InventorySlotView)itemView; } } } } Класс InventoryView: (EventManager — это созданная мной пользовательская система событий, инвентарь запускает событие глобального изменения)
с использованием Android.App; использование Android.Content; использование Android.OS; использование Android.Runtime; использование Android.Util; использование Android.Views; с помощью Android.Виджет; использование AndroidX.RecyclerView.Widget; использование MineClick.EventSystem; использование MineClick.EventSystem.EventArguments; использование MineClick.Материалы; с помощью MineClick.Utility; использование системы; использование System.Collections.Generic; используя System.Linq; использование System.Text; использование статического MineClick.EventSystem.EventManager; пространство имен MineClick { внутренний класс InventoryView: LinearLayout { частный статический только для чтения int SIZE = 80; личный инвентарь инвентарь {get; набор; } частное Action _onClickActions {get; набор; } public Action OnClickActions {get => _onClickActions; установить {_onClickActions = значение; Адаптер.OnClickActions = значение; } } частный адаптер InventoryAdapter {get; набор; } общественный InventorySlotView _selected {получить; набор; } общественный InventorySlotView SelectedItem {get => _selected; set { if(_selected!= null) _selected.Higlighted = false; _selected = значение; if(value!= null) value.Higlighted = true; } } public InventoryView (контекст контекста, Inventory inv, действия Action): база (контекст) { this.inventory = инв; _onClickActions = DefaultClickEventAction + действия; EventManager.BindListener(Events.INVENTORY_CHANGED,HandleInventoryChangeEvent); Инициализировать(); } public InventoryView (контекст контекста, инвентарь inv): this (context, inv, null) { } Private void HandleInventoryChangeEvent (отправитель объекта, EA_INVENTORY_CHANGE args) { if (args.ChangedInventory == инвентарь) Обновлять(); } public void SetSelected (элемент элемента) { если (пункт == ноль) возвращаться; SelectedItem = Adaptor.InvItems.Find(x => x.DisplayedItem != null && x.DisplayedItem.GetItem().Id == item.Id); } частная пустота Инициализация() { LayoutParameters = новые LayoutParams (LayoutParams.MatchParent, LayoutParams.MatchParent); Ориентация = Ориентация.Вертикально; RecyclerView recyclerView = новый RecyclerView(Контекст); RecyclerView.LayoutParams recyclerParams = новый RecyclerView.LayoutParams(ViewGroup.LayoutParams.MatchParent, ViewGroup.LayoutParams.WrapContent); int columns = Math.Max(1, ConstantsApplication.AppWidth / ConstantsApplication.SlotSize); int size = Inventory.Size() > РАЗМЕР ? инвентарь.Размер() : РАЗМЕР; размер += столбцы - размер столбцов %; Адаптер = новый InventoryAdapter (инвентарь, размер); Адаптер.OnClickActions = OnClickActions; Менеджер GridLayoutManager = новый GridLayoutManager (Контекст, столбцы); Manager.Orientation = (int) Orientation.Vertical; recyclerView.SetLayoutManager(менеджер); recyclerView.SetAdapter(Адаптер); recyclerView.LayoutParameters = recyclerParams; AddView (RecyclerView); } публичное недействительное обновление() { Адаптер.NotifyDataSetChanged(); } частная пустота DefaultClickEventAction (InventoryClickEvent e) { bool выделено = e.ClickedItem.Higlighted; e.InventoryItems.ForEach(i => i.Higlighted = false); e.ClickedItem.Higlighted = !выделено; ВыбранныйЭлемент = e.ClickedItem; } внутренний класс InventoryClickEvent { общественный InventorySlotView ClickedItem {get; частный набор; } общественный список InventoryItems {get; } public InventoryClickEvent (InventorySlotView clickedItem, List MaterialIcons) { ClickedItem = clickedItem; InventoryItems = MaterialIcons; } } } } InventorySlotView
с использованием Android.App; использование Android.Content; использование Android.Графика; использование Android.OS; использование Android.Runtime; использование Android.Util; использование Android.Views; с помощью Android.Виджет; с помощью MineClick.Кирки; использование MineClick.PlayerStorage; использование MineClick.PlayerStorage.InventoryItems; с помощью MineClick.Utility; использование системы; использование System.Collections.Generic; используя System.Linq; использование System.Text; пространство имен MineClick.Materials { внутренний класс InventorySlotView: RelativeLayout { частный InventoryItem _item; общественный InventoryItem DisplayedItem {получить => _item; установить { _item = значение; ПриИзмененииМатериала(); } } частный bool _highlighted {получить; набор; } public bool Highlighted {get => _highlighted; установить { _highlighted = значение; Недействителен(); } } Значок просмотра; частная краска borderPaint; public InventorySlotView (контекст контекста, элемент InventoryItem = null): база (контекст) { Инициализировать(); DisplayedItem = элемент; } частная пустота Инициализация() { _highlighted = ложь; borderPaint = новая краска (); borderPaint.SetStyle(Paint.Style.Stroke); границаPaint.StrokeWidth = 10; RelativeLayout.LayoutParams layoutParams = новый RelativeLayout.LayoutParams(ConstantsApplication.SlotSize, ConstantsApplication.SlotSize); Параметры макета = Параметры макета; SetBackgroundColor(Color.DarkGray); Иницикон(); } частная пустота InitIcon() { если (Значок != ноль) УдалитьВид(Значок); если (DisplayedItem! = ноль) { Значок = DisplayedItem.GetDisplayIcon(Контекст); RelativeLayout.LayoutParams imageParams = новый RelativeLayout.LayoutParams(LayoutParams.MatchParent, LayoutParams.MatchParent); int border = (int)borderPaint.StrokeWidth; imageParams.SetMargins(10 + граница, 10 + граница, 0 + граница, 10 + граница); Icon.LayoutParameters = imageParams; ДобавитьВид(Значок); } } частная пустота OnMaterialChange() { Иницикон(); } публичное переопределение void Draw (холст Canvas) { borderPaint.Color = _highlighted? Color.ParseColor("#3498db") : Color.Black; base.Draw(холст); холст.DrawRect(новый Rect(0,0,Width,Height),borderPaint); } } } Фрагмент:
с использованием Android.Graphics; использование Android.OS; использование Android.Views; с помощью Android.Виджет; используя AndroidX.Fragment.App; использование MineClick.Crafting.Bench; использование MineClick.Crafting.Bench.CostList; использование MineClick.EventSystem; использование MineClick.EventSystem.EventArguments; использование MineClick.Материалы; с помощью MineClick.Navigation; с помощью MineClick.Кирки; с помощью MineClick.Player; с помощью MineClick.Utility; использование статического MineClick.EventSystem.EventManager; использование статического MineClick.InventoryView; пространство имен MineClick.Crafting { внутренний класс CraftFragment: Фрагмент { CraftAdapter CraftAdapter {получить; набор; } публичное переопределение void OnCreate (Bundle saveInstanceState) { base.OnCreate(saveInstanceState); } общедоступное переопределение View OnCreateView (инфлятор LayoutInflater, контейнер ViewGroup, Bundle saveInstanceState) { Просмотр представления = inflater.Inflate(Resource.Layout.crafting_activity,Container, false); Оболочка LinearLayout = view.FindViewById[*](Resource.Id.crafting_wrraper); LinearLayout InventoryWrraper = view.FindViewById(Resource.Id.inventory_wrraper); LinearLayout CostListWrraper = view.FindViewById(Resource.Id.cost_list_wrraper); Скамейка CraftingBench = новый CraftingBench (Контекст); wrraper.AddView(скамья); InventoryView InventoryDisplay = новый InventoryView(Context, PlayerApplication.Instance.Player.PlayerInventory); InventoryWrraper.AddView(inventoryDisplay); CostListView CostList = новый CostListView (Контекст); CostListWrraper.AddView(costList); CraftAdapter = новый CraftAdapter (inventoryDisplay, скамейка, CostList); обратный вид; } } } Несколько замечаний:
notifysetdatachanged вызывается, я проверил.
[*]
Я пробовал использовать метод post обработчика, не помогло.
[*]
данные меняются, проверил.
[*]
Я пытался очистить инвентарь и добавить в него элементы, а затем вызвать notifydatasetchanged, не помогло.
[*]
обновление работает при первой инициализации фрагмента, но после повторного использования (замены) перестает обновлять представление переработчика
[*]
Прокрутка представления переработчика приводит к обновлению представления переработчика
Будем очень признательны за любую помощь!
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
NotifyDatasetchAnged () не обновляется ListView после введения данных через диалог
Anonymous » » в форуме Android - 0 Ответы
- 2 Просмотры
-
Последнее сообщение Anonymous
-