我在
Spinner
中添加了 RecyclerView
,当我尝试获取微调器所选项目数据时,它获取另一个/错误的位置数据,任何人都建议我从 Spinner
onItemSelected
获取正确的所选项目和位置
这是我的代码
@Override
public void onBindViewHolder(final QuestionHolder holder, final int position) {
if (position % 2 == 1)
holder.itemView.setBackgroundColor(Color.parseColor("#F8F8F8"));
adapter = new ArrayAdapter<Option>(binding.getRoot().getContext(),
R.layout.item_spinner, questionList.get(position).getOptions());
adapter.setDropDownViewResource(R.layout.item_spinner);
binding.optionSpinner.setAdapter(adapter);
binding.serialNo.setText((position + 1) + ".");
binding.setQuestion(questionList.get(position));
binding.executePendingBindings();
binding.optionSpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
Toast.makeText(holder.itemView.getContext(), position+" : "+binding.optionSpinner.getSelectedItem().toString(), Toast.LENGTH_SHORT).show();
spinnerData.setSelectedData(position, binding.optionSpinner.getSelectedItem().toString());
}
@Override
public void onNothingSelected(AdapterView<?> parent) {
}
});
}
我想你必须尝试这个
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
}
});
检查此项,可能会有所帮助,并可能解决您的问题。如果这不能解决你的问题,至少你可以摆脱 Lint 错误。 Lint 错误“不要将位置视为固定;只能立即使用...”。因此,无论您在哪里使用
final int position**
,请将其更改为 getAdapterPosition()
;
RecyclerView.Adapter.onBindViewHolder()的文档 状态:
注意与ListView不同,RecyclerView不会调用该方法 如果项目在数据集中的位置发生变化,除非 项目本身无效或无法确定新位置。 因此,您应该只使用位置参数 获取此方法内的相关数据项,不应保留 它的副本。如果您稍后需要某个项目的位置(例如在 单击侦听器),使用 getAdapterPosition() 它将更新 适配器位置
因此,从技术上讲,项目可能会重新排列,并且不会绑定 必要的,因为项目尚未失效。
收到的变量仅在绑定函数的范围内成立,并且 并不总是指向数据集中的正确位置。这就是为什么 每次更新时都必须调用函数position
需要职位。getAdapterPosition()
恕我直言,
仍然 可能是错误的。因为项目可能会重新排列并且mLastPosition = holder.getAdapterPosition();
仍指向旧位置。mLastPosition
关于 lint 为何沉默,或许 Lint 规则还没有那么彻底。它是 仅检查
参数是否被复制。position