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.
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