RecyclerView适配器Lint错误不会将位置视为已修复

Pra*_*ani 0 android android-adapter android-checkbox android-recyclerview

我有这种类型的错误,但我没有得到我能做的事情.

我得到了以下lint错误.

不要把位置视为固定; 只能立即使用并调用holder.getAdapterPosition()以便稍后查找.

当项目的位置在数据集中发生变化时,RecyclerView不会再次调用onBindViewHolder,除非项目本身无效或无法确定新位置.因此,您只应在获取此方法中的相关数据项时使用position参数,并且不应保留它的副本.

如果您稍后需要某个项目的位置(例如,在单击侦听器中),请使用具有更新的适配器位置的getAdapterPosition().

我的RecyclerView适配器:

   /**
     * Right Content Adapter
     */
    public class RightContentAdapter
            extends RecyclerView.Adapter<RightContentAdapter.ViewHolder> {

        public final ArrayList<IdNamePair> mValues;
        public Activity context;
        private int pos;

        public RightContentAdapter(Activity context, ArrayList<IdNamePair> items) {
            mValues = items;
            this.context = context;

        }

        @Override
        public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
            View view = LayoutInflater.from(parent.getContext())
                    .inflate(R.layout.activity_filter_checkbox, parent, false);

            Log.logInfo("onCreateViewHolder call");

            return new ViewHolder(view);
        }

        @Override
        public void onBindViewHolder(final ViewHolder holder, final int position) {
            final IdNamePair idNamePair = mValues.get(position);
            holder.onBind = true;
            Log.logError("onBind");
            if (idNamePair.getName() != null) {
                holder.mItemCheckBox.setText(idNamePair.getName());
                holder.mItemCheckBox.setChecked(idNamePair.isChecked());

                if (idNamePair.isChecked())
                    countFilter++;
            }

            holder.onBind = false;
            holder.mItemCheckBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
                @Override
                public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                    Log.logInfo("isChecked : " + isChecked);
                    boolean check = false;
                    if (isChecked)
                        countFilter++;
                    else {
                        countFilter--;
                    }
                    if (filterAttributeArrayList != null) {
                        int filterAttribSize = filterAttributeArrayList.size();
                        for (int i = 0; i < filterAttribSize; i++) {
                            FilterAttribute fa = filterAttributeArrayList.get(i);
                            if (selectedAttributeName.equalsIgnoreCase(fa.getAttrName())) {
                                check = true;

                                filterAttributeArrayList.get(i).getAttrVal().get(position).setIsChecked(isChecked);
                                filterAttributeArrayList.get(i).setFilterCount(countFilter);
                                mValues.get(position).setIsChecked(isChecked);
                                //countFilter = 0;
                                // if(!holder.onBind)
                                // notifyItemChanged(position);


                                //mRightContentAdapter.notifyItemChanged(position);
                                break;
                            }
                        }
                    }
                    if (!check) {
                        if (staticFilterArrayList != null) {
                            int staticFilterSize = staticFilterArrayList.size();
                            for (int i = 0; i < staticFilterSize; i++) {
                                StaticFilterData sf = staticFilterArrayList.get(i);
                                if (selectedAttributeName.equalsIgnoreCase(sf.getDisplayName())) {

                                    staticFilterArrayList.get(i).getValue().get(position).setIsChecked(isChecked);
                                    staticFilterArrayList.get(i).setFilterCount(countFilter);
                                    mValues.get(position).setIsChecked(isChecked);
                                    //  countFilter = 0;
                                    //     if(!holder.onBind)
                                    //       notifyItemChanged(position);
                                    //mRightContentAdapter.notifyItemChanged(position);
                                    break;
                                }
                            }
                        }
                    }

                }
            });
        }

        @Override
        public int getItemCount() {
            return mValues.size();
        }

        //View Holder
        public class ViewHolder extends RecyclerView.ViewHolder {

            //  private final View mView;
            private CheckBox mItemCheckBox;

            ViewHolder(View view) {
                super(view);
                //     mView = view;
                mItemCheckBox = (CheckBox) view.findViewById(R.id.filter_checkbox);
                mItemCheckBox.setTypeface(Font.getMyRiadProRegular(context));
            }
        }
    }
Run Code Online (Sandbox Code Playgroud)

我用它来制作像Flipkart这样的Filter类型Activity.有时复选框也会在滚动时自动取消选中.我的代码有什么问题吗?

谢谢.

Gau*_*ngh 15

不要在方法中position作为最终,onBindViewHolder而不是holder作为最终,并使用holder.getAdapterPosition()无论你在哪里使用position.

甚至不要这样做:int var = holder.getAdapterPosition(),马上使用holder.getAdapterPosition().你的第一个问题就解决了.:)

接下来当你滚动时,你的一些复选框会被取消选中,因为recyclerView会重新使用itemView而不是创建新的,这就是为什么它比listView更好.所以你需要妥善处理它.如果你能确切地说出你想要做什么,onCheckChangedListener那么我肯定可以帮你解决这个问题.