微调器显示的值(选择)在适配器更新后更改(notifyDataSetChanged)

时间:2018-09-09 16:28:47

标签: android android-layout android-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. 在为adpater调用notifyDataSetChanged之后,如何确定Spinner何时完成了视图更新?

  2. 如何在适配器中查找值(标签)的位置(索引)?是因为要查询适配器还是要通过元素循环?

1 个答案:

答案 0 :(得分:0)

如果要保持当前选择的,而不是当前选择的位置,则必须实现适配器的getItemId(int position)回调,例如

  • 微调框中的每个项目都有唯一的ID
  • 同一项目始终具有相同的ID

getItemId()的常见实现只返回零,或者返回项目的position。这些都不能在这种情况下工作。理想情况下,您将具有可以返回的实际逻辑ID,但是如果您拥有的 only 对象是String,则可以使用字符串的hashCode()方法:

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

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

不太可能使用两个不同的字符串来具有相同的哈希码,但这并非不可能。