Как установить текст в списке после вызова notifyDataSetChanged()

Сценарий: у меня есть ListView, который, когда пользователь щелкает дочерний элемент, устанавливает значение TextView внутри < em>ListView через основное действие.

У меня есть FloatingActionButton, который добавляет и вычитает объект для подсчета количества элементов в ListView.

Чтобы добавить или вычесть количество дочерних элементов, отображаемых ListView, я вызываю notifyDataSetChanged().

Я пытаюсь вернуть введенный текст обратно в TextView после вызова notifyDataSetChanged()


Проблема: notifyDataSetChanged() сбрасывает TextView обратно в пустое состояние после завершения его работы.

Что я пробовал: я пытался сохранить все значения в элементах ListView в отдельном String[] savedItems и установить текст в TextView. . Я запускаю код шаг за шагом в отладчике и вижу, что код сохраняет текст и фактически устанавливает текст, но по какой-то причине notifyDataSetChanged() не завершил свою работу.

Как установить текст после завершения notifyDataSetChanged()?


Код в вопросе:

public void addNewThought(int numberOfThoughts) {
    String[] savedDistortionsList = saveDistortions(); // This saves each childs text

    selectedItems[numberOfThoughts] = new ArrayList<String>();
    IntegerNumberOfThoughts.add(Integer.toString((numberOfThoughts++)) ); // Just the variable that counts the number of children needed in ListView

    distortionsAdapter.notifyDataSetChanged(); // Refresh ListView
    setBackDistortionsList(savedDistortionsList); // Put back text into ListView
}

saveDistortions() работает, поэтому я не думаю, что это необходимо показывать, но вот код для setBackDistortionsList(), который я тестировал, и на самом деле он устанавливает TextView в ListView, но по какой-то причине он просто не отображается.

setBackDistortionsList

private void setBackDistortionsList(String[] savedDistortionsList) {
    View tempView;
    TextView tempTextView;
    for (int i = 0; i < savedDistortionsList.length; i++) {
        tempView = LDistortions.getChildAt(i);
        tempTextView = (TextView) tempView.findViewById(R.id.textEntry);
        tempTextView.setText(savedDistortionsList[i]);
    }
}

person Rayaarito    schedule 04.07.2018    source источник


Ответы (1)


Ответ был найден здесь: Как мне проверить, когда мой ListView закончил перерисовку?

Скопируйте и вставьте от пользователя @Petro

Надеюсь, это может помочь:

  • Настройте addOnLayoutChangeListener в списке
  • Вызов .notifyDataSetChanged();
  • Это запустит OnLayoutChangeListener после завершения
  • Удалить слушателя
  • Выполнить код при обновлении (getLastVisiblePosition())

    mListView.addOnLayoutChangeListener(new View.OnLayoutChangeListener() {
    
      @Override
    public void onLayoutChange(View v, int left, int top, int right, int bottom, int oldLeft, int oldTop, int oldRight, int oldBottom) {
        mListView.removeOnLayoutChangeListener(this);
        Log.e(TAG, "updated");
      }
    });
    
    mAdapter.notifyDataSetChanged();
    
person Rayaarito    schedule 31.08.2018