【发布时间】:2019-06-13 05:25:25
【问题描述】:
我已阅读以下内容:
ArrayList not updating after using .clear()
notifydataSetChanged working but only showing 1 result in listview Android
notifyDataSetChanged() does not affect my adapterView
Android: notifyDataSetChanged(); not working
notifydatasetchanged() not working after onbackpressed()
Android notifyDataSetChanged not working
Android notifyDataSetChanged() not working
仍然无法让我的适配器从新数据集进行更新。
我在调试模式的代码如下:
public class PetInformationActivity extends AppCompatActivity
implements 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 = null
listAssignments = (ArrayList@5411) size = 0
Log.d(TAG, "listAssignments has " + listAssignments.size() + " Assignment objects in it");
Log.d(TAG, "listAssignments is: " + listAssignments);
此时调试中:
mAdapter = null
listAssignments = (ArrayList@5461) size = 1
0 = (Assignment@5496)"Assignment{mType='兽医', mProviderName='red 兽医'}"
mAdapter = new AssignmentsAdapter(this, listAssignments);
此时调试中:
mAdapter = (AssignmentsAdapter@5499)
listAssignments = (ArrayList@5461) size = 1
0 = (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);
此时调试中:
mAdapter = (AssignmentsAdapter@5499)
listAssignments = (ArrayList@5461) size = 0**
listAssignments = sPetInformationViewModel.getAssignedProviders(petId);
Log.d(TAG, "listAssignments is: " + listAssignments);
此时调试中:
mAdapter = (AssignmentsAdapter@5499)
listAssignments = (ArrayList@5594) size = 1
0 = (Assignment@5607)"Assignment{mType='Veterinarian', mProviderName='red vet'}"
mAdapter.notifyDataSetChanged();
}
此时屏幕是空白的,它应该显示在 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() 的目的是使用现有的适配器进行更新,这样现有的适配器就不必被销毁,并且在每个数据集更改时创建一个新的适配器,如下所示:
【问题讨论】:
标签: java android arraylist notifydatasetchanged