在 RecyclerView 中获取微调器选定的项目

问题描述 投票:0回答:2

我在

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) {

            }
        });

    }
android android-recyclerview android-spinner
2个回答
4
投票

我想你必须尝试这个

  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
投票

检查此项,可能会有所帮助,并可能解决您的问题。如果这不能解决你的问题,至少你可以摆脱 Lint 错误。 Lint 错误“不要将位置视为固定;只能立即使用...”。因此,无论您在哪里使用

final int position**
,请将其更改为
getAdapterPosition()

RecyclerView.Adapter.onBindViewHolder()的文档 状态:

注意与ListView不同,RecyclerView不会调用该方法 如果项目在数据集中的位置发生变化,除非 项目本身无效或无法确定新位置。 因此,您应该只使用位置参数 获取此方法内的相关数据项,不应保留 它的副本。如果您稍后需要某个项目的位置(例如在 单击侦听器),使用 getAdapterPosition() 它将更新 适配器位置

因此,从技术上讲,项目可能会重新排列,并且不会绑定 必要的,因为项目尚未失效。

position
收到的变量仅在绑定函数的范围内成立,并且 并不总是指向数据集中的正确位置。这就是为什么 每次更新时都必须调用函数
getAdapterPosition()
需要职位。

恕我直言,

mLastPosition = holder.getAdapterPosition();
仍然 可能是错误的。因为项目可能会重新排列并且
mLastPosition
仍指向旧位置。

关于 lint 为何沉默,或许 Lint 规则还没有那么彻底。它是 仅检查

position
参数是否被复制。

© www.soinside.com 2019 - 2024. All rights reserved.