我有一个微调器。选择一个项目并通过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();
更新 帮助至少两个问题:
在为adpater调用notifyDataSetChanged之后,如何确定Spinner何时完成了视图更新?
如何在适配器中查找值(标签)的位置(索引)?是因为要查询适配器还是要通过元素循环?
答案 0 :(得分:0)
如果要保持当前选择的项,而不是当前选择的位置,则必须实现适配器的getItemId(int position)
回调,例如
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();
}
不太可能使用两个不同的字符串来具有相同的哈希码,但这并非不可能。