Я прочитал следующее:
ArrayList не обновляется после использования .clear()
notifydataSetChanged работает, но показывает только 1 результат в списке Android
notifyDataSetChanged() не влияет на мой адаптерView
Android: notifyDataSetChanged(); не работает
notifydatasetchanged() не работает после onbackpressed()
Android notifyDataSetChanged не работает
Android notifyDataSetChanged() не работает
И все еще не могу заставить мой адаптер обновляться из нового набора данных.
Мой код в режиме отладки выглядит следующим образом:
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='красный ветеринар'}"
mAdapter = new AssignmentsAdapter(this, listAssignments);
На данный момент выполняется отладка:
mAdapter = (AssignmentsAdapter@5499)
listAssignments = (ArrayList@5461) size = 1
0 = (Assignment@5496)"Assignment{mType ='Ветеринар', mProviderName='красный ветеринар'}"
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 ='Ветеринар', mProviderName='красный ветеринар'}"
mAdapter.notifyDataSetChanged();
}
В этот момент экран пуст, хотя должен показывать текст, показанный в Assignment@5607. Похоже, что notififyDataSetChanged() уведомил mAdapter об изменении текста, показанного в onCreate (ArrayList@5461), на очистку в onResume (ArrayList@5461), но не о новом вызове данных в onResume (ArrayList@5594).
Похоже, это указывает на то, что когда mAdapter был инициализирован для listAssignments, он был настроен на использование ArrayList по адресу @5461. Когда в onResume был сделан вызов новых данных, при а) возврате после использования кнопки «Назад» и (б) при первом запуске этого действия новый ArrayList был создан по другому адресу.
Поэтому кажется, что я неправильно включил свой ArrayList, поскольку все обновления listAssignments приведут к созданию совершенно нового объекта ArrayList, который никогда не будет использоваться для обновления mAdapter, который всегда будет обновляться до исходного ArrayList по адресу @5461.
Я искал информацию о том, как правильно привязать адаптер к ArrayList, но я не нашел ничего, что намекало бы на большее, чем я сделал. Я предполагаю, что целью notifyDataSetChanged() является обновление с использованием существующего адаптера, чтобы существующий адаптер не нужно было уничтожать, а новый создавался при каждом изменении набора данных, как показано здесь: