第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

由于 ArrayList 到適配器綁定問題,notifyDataSetChanged()

由于 ArrayList 到適配器綁定問題,notifyDataSetChanged()

慕田峪7331174 2022-05-12 17:22:35
并且仍然無法讓我的適配器從新數(shù)據(jù)集中進(jìn)行更新。我在調(diào)試模式下的代碼如下:public class PetInformationActivity extends AppCompatActivityimplements ConfirmDialogFragment.ConfirmDialogListener, MedicalInformationFragment.OnFragmentInteractionListener{private static List<Assignment> listAssignments = new ArrayList<>();private static AssignmentsAdapter mAdapter;private static PetInformationViewModel sPetInformationViewModel;...protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);.../*** get the providers' IDs assigned to the pet: fillAssignmentsArray()*/listAssignments = sPetInformationViewModel.getAssignedProviders(petId);此時調(diào)試中:mAdapter = nulllistAssignments = (ArrayList@5411) size = 0Log.d(TAG, "listAssignments has " + listAssignments.size() + " Assignment objects in it");  Log.d(TAG, "listAssignments is: " + listAssignments);   此時調(diào)試中:mAdapter = nulllistAssignments = (ArrayList@5461) size = 10 = (Assignment@5496)"Assignment{mType='Veterinarian', mProviderName='red vet'}"mAdapter = new AssignmentsAdapter(this, listAssignments);   此時調(diào)試中:mAdapter = (AssignmentsAdapter@5499)listAssignments = (ArrayList@5461) size = 10 = (Assignment@5496)"Assignment{mType='Veterinarian', mProviderName='red vet'}"mRecyclerView.setAdapter(mAdapter);...}public void onResume(){super.onResume();Log.d(TAG, "Entered: onResume");listAssignments.clear();Log.d(TAG, "listAssignments is: " + listAssignments);此時屏幕是空白的,它應(yīng)該顯示在 Assignment@5607 中顯示的文本。似乎 notififyDataSetChanged() 通知 mAdapter 將 onCreate (ArrayList@5461) 中顯示的文本更改為清除 onResume (ArrayList@5461),但沒有通知 onResume (ArrayList@5594) 中對數(shù)據(jù)的新調(diào)用。這似乎表明當(dāng) mAdapter 初始化為 listAssignments 時,它被設(shè)置為使用地址 @5461 的 ArrayList。當(dāng)在 onResume 中調(diào)用新數(shù)據(jù)時,在 a) 使用后退按鈕返回和 (b) 當(dāng)此 Activity 首次啟動時,會在不同的地址創(chuàng)建一個新的 ArrayList。因此,我似乎沒有正確地合并我的 ArrayList,因為對 listAssignments 的所有更新都會產(chǎn)生一個全新的 ArrayList 對象,該對象永遠(yuǎn)不會用于更新 mAdapter,它將始終更新為地址 @5461 處的初始 ArrayList。我已經(jīng)搜索了有關(guān)如何正確地將適配器綁定到 ArrayList 的信息,但我沒有找到任何暗示比我所做的更多的信息。我假設(shè) notifyDataSetChanged() 的目的是使用現(xiàn)有的適配器進(jìn)行更新,這樣現(xiàn)有的適配器就不必被銷毀,并且在每個數(shù)據(jù)集更改時創(chuàng)建一個新的適配器
查看完整描述

2 回答

?
四季花海

TA貢獻(xiàn)1811條經(jīng)驗 獲得超5個贊

好吧,我在這里跑題了,說 notifyDataSetChanged() 不適用于 ArrayList,因為在每次加載時,它的地址都會發(fā)生變化,請參閱我的原始帖子和對 pnavk 的評論以查看詳細(xì)信息。據(jù)我了解,Java 無法像 C 或 C++ 那樣通過指針固定 ArrayList 的地址,因此適配器被設(shè)置為原始 ArrayList 對象的內(nèi)存位置,因此每次都指向相同的數(shù)據(jù)即使 Java 為該 ArrayList 對象使用了新的內(nèi)存位置,或者創(chuàng)建了一個全新的同名 ArrayList 對象,也會調(diào)用 notifyDataSetChanged()。

因此,我從 ArrayList 中的新數(shù)據(jù)集更新 RecyclerView 的答案是將 onResume 中的 Adapter 重置為新的,然后將該 Adapter 重新分配給您的 RecyclerView,正如我在對 pnavk 的回復(fù)中提到的那樣:

mAdapter = new AssignmentsAdapter(this, listAssignments);
 mRecyclerView.setAdapter(mAdapter);


查看完整回答
反對 回復(fù) 2022-05-12
?
揚帆大魚

TA貢獻(xiàn)1799條經(jīng)驗 獲得超9個贊

您傳遞給 ArrayAdapter 的引用與此處分配的引用不同:


listAssignments = sPetInformationViewModel.getAssignedProviders(petId);

就 ArrayAdapter 而言,它所引用的 listAssignments 已被清除 OnResume 并且沒有任何內(nèi)容被添加回它。它對新的 listAssignments 參考一無所知。


嘗試這樣做:


public void onResume()

{

    super.onResume();

    Log.d(TAG, "Entered: onResume");

    listAssignments.clear();

    Log.d(TAG, "listAssignments is: " + listAssignments);

    List<Assignment> newList = sPetInformationViewModel.getAssignedProviders(petId);

    listAssignments.addAll(newList);

    mAdapter.notifyDataSetChanged();

}


查看完整回答
反對 回復(fù) 2022-05-12
  • 2 回答
  • 0 關(guān)注
  • 149 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號