亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

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

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

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

慕田峪7331174 2022-05-12 17:22:35
并且仍然無法讓我的適配器從新數據集中進行更新。我在調試模式下的代碼如下: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);此時調試中:mAdapter = nulllistAssignments = (ArrayList@5411) size = 0Log.d(TAG, "listAssignments has " + listAssignments.size() + " Assignment objects in it");  Log.d(TAG, "listAssignments is: " + listAssignments);   此時調試中:mAdapter = nulllistAssignments = (ArrayList@5461) size = 10 = (Assignment@5496)"Assignment{mType='Veterinarian', mProviderName='red vet'}"mAdapter = new AssignmentsAdapter(this, listAssignments);   此時調試中: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);此時屏幕是空白的,它應該顯示在 Assignment@5607 中顯示的文本。似乎 notififyDataSetChanged() 通知 mAdapter 將 onCreate (ArrayList@5461) 中顯示的文本更改為清除 onResume (ArrayList@5461),但沒有通知 onResume (ArrayList@5594) 中對數據的新調用。這似乎表明當 mAdapter 初始化為 listAssignments 時,它被設置為使用地址 @5461 的 ArrayList。當在 onResume 中調用新數據時,在 a) 使用后退按鈕返回和 (b) 當此 Activity 首次啟動時,會在不同的地址創建一個新的 ArrayList。因此,我似乎沒有正確地合并我的 ArrayList,因為對 listAssignments 的所有更新都會產生一個全新的 ArrayList 對象,該對象永遠不會用于更新 mAdapter,它將始終更新為地址 @5461 處的初始 ArrayList。我已經搜索了有關如何正確地將適配器綁定到 ArrayList 的信息,但我沒有找到任何暗示比我所做的更多的信息。我假設 notifyDataSetChanged() 的目的是使用現有的適配器進行更新,這樣現有的適配器就不必被銷毀,并且在每個數據集更改時創建一個新的適配器
查看完整描述

2 回答

?
四季花海

TA貢獻1811條經驗 獲得超5個贊

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

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

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


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

TA貢獻1799條經驗 獲得超9個贊

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


listAssignments = sPetInformationViewModel.getAssignedProviders(petId);

就 ArrayAdapter 而言,它所引用的 listAssignments 已被清除 OnResume 并且沒有任何內容被添加回它。它對新的 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();

}


查看完整回答
反對 回復 2022-05-12
  • 2 回答
  • 0 關注
  • 151 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號