我在Spinner
内添加了RecyclerView
,当我试图获取微调器选择的项目数据时,它获取另一个/错误的位置数据,任何一个建议我从{获得正确的选定项目和位置{1}} Spinner
这是我的代码
onItemSelected
答案 0 :(得分:3)
我认为你必须尝试这个
showSpinnerList.setOnItemSelectedListener(new
AdapterView.OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> parent, View view, int
position, long id) {
// On selecting a spinner item
String item = parent.getItemAtPosition(position).toString();
}
@Override
public void onNothingSelected(AdapterView<?> parent) {
// todo for nothing selected
}
});
答案 1 :(得分:0)
检查一下,可能会有所帮助,可能会解决您的问题。如果这不能解决你的问题,至少你摆脱了Lint错误。 Lint error “Do not treat position as fixed; only use immediately…”。因此,无论您在使用final int position**
的任何地方,都要将其更改为getAdapterPosition()
;
RecyclerView.Adapter.onBindViewHolder()的文档 规定:
请注意,与ListView不同,RecyclerView不会调用此方法 再次,如果项目的位置在数据集中发生变化,除非 项目本身无效或无法确定新职位。 因此,您应该只使用position参数 获取此方法中的相关数据项,不应保留 它的副本。如果您稍后需要某个项目的位置(例如,在 点击监听器),使用将更新的getAdapterPosition() 适配器位置
因此,从技术上讲,项目可能会重新安排,而绑定则不会 必要的,因为项目尚未失效。
position
收到的变量仅适用于绑定函数的范围和 并不总是指向数据集中的正确位置。这就是为什么 每次更新时都必须调用函数getAdapterPosition()
需要立场。恕我直言,
mLastPosition = holder.getAdapterPosition();
仍在 可能是错的。因为项目可能会被重新安排,mLastPosition
仍然指向旧位置。关于为什么lint是沉默的,也许Lint规则并不那么彻底。它的 仅检查是否正在复制
position
参数。