Изменение отображаемого значения счетчика (выбор) после обновления адаптера (notifyDataSetChanged) - PullRequest
0 голосов
/ 09 сентября 2018

У меня есть Spinner. После выбора элемента и обновления адаптера с помощью notifyDataSetChanged выбранный элемент, отображаемый в Spinner (Textview), изменяется. Эта функциональность разработана. Поскольку выбранная позиция осталась прежней, но значение выбранной позиции изменилось из-за нового содержимого от обновления адаптера.

Я хочу продолжить отображение первоначально выбранного элемента после обновления адаптера.

Я надеялся, что это решение сработает, но событие / список никогда не запускаются. Может быть, потому что я использую Spinner и список не отображается?

https://stackoverflow.com/a/29173680/2330272

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();

Обновление Помогите хотя бы с двумя вопросами:

  1. Как определить, когда Spinner завершил обновление представления после вызова notifyDataSetChanged для adpater?

  2. Как найти положение (индекс) значения (метки) в адаптере? Как переходить к адаптеру или проходить через элементы?

1 Ответ

0 голосов
/ 09 сентября 2018

Если вы хотите сохранить текущий выбранный элемент , в отличие от текущей выбранной позиции , то вам потребуется реализовать обратный вызов getItemId(int position) адаптера так, чтобы:

  • Каждый предмет в блесне имеет уникальный идентификатор
  • Один и тот же предмет всегда имеет один и тот же идентификатор

Обычные реализации getItemId() просто возвращают ноль или, возможно, position элемента. Ни один из них не будет работать в этой ситуации. В идеале у вас должен быть реальный логический идентификатор, который вы можете вернуть, но если у вас есть only , то String, тогда вы можете использовать hashCode() метод строки:

@Override
public String getItem(int position) {
    return list.get(position);
}

@Override
public long getItemId(int position) {
    return list.get(position).hashCode();
}

Две разные строки вряд ли имеют одинаковый хеш-код, но это не невозможно.

...