0

J'ai surfé ce type d'erreur mais je n'ai pas compris ce que je peux faire dans mon cas.RecyclerView Adapter Lint Erreur ne pas traiter la position comme fixe

Je reçois l'erreur suivante.

Ne pas traiter la position comme fixe; utilisez-le immédiatement et appelez le holder.getAdapterPosition() pour le rechercher plus tard. RecyclerView n'appellera plus à nouveauBindViewHolder lorsque la position de changera dans l'ensemble de données sauf si l'article lui-même est invalidé ou si la nouvelle position ne peut pas être déterminée. Pour cette raison, vous devez utiliser uniquement le paramètre de position lors de l'acquisition de l'élément de données associé à l'intérieur de cette méthode et n'en conserver aucune copie.

Si vous avez besoin de la position d'un élément ultérieurement (par exemple, dans un écouteur de clic ), utilisez getAdapterPosition() qui aura la position d'adaptateur mise à jour.

Mon adaptateur 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)); 
      } 
     } 
    } 

Je l'ai utilisé pour faire le type de filtre activité comme Flipkart. Parfois, la case à cocher est également désactivée automatiquement lors du défilement. Y a-t-il quelque chose qui ne va pas dans mon code?

Merci.

+0

Copie possible de [Erreur de peluche "Ne pas traiter la position comme fixe, seulement utiliser immédiatement ..."] (http://stackoverflow.com/questions/34942840/lint-error-do-not-treat-position- as-fixed-only-use-immédiatement) – Reyske

Répondre

9

Ne pas faire position comme finale dans onBindViewHolder méthode au lieu de faire seulement que holder comme définitive et faire usage de holder.getAdapterPosition() où vous utilisez position.

Ne faites même pas quelque chose comme ceci: int var = holder.getAdapterPosition(), utilisez immédiatement holder.getAdapterPosition(). Votre premier problème est résolu. :)

Ensuite, lorsque vous faites défiler, certaines de vos cases ne sont pas cochées car recyclerView réutilise itemView au lieu de créer un nouveau, c'est pourquoi il est meilleur que listView. Donc, vous devez le gérer correctement. Si vous pouvez dire exactement ce que vous essayez de faire dans onCheckChangedListener alors je peux sûrement vous aider à gérer cela.