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那么我肯定可以帮你解决这个问题.
| 归档时间: |
|
| 查看次数: |
3874 次 |
| 最近记录: |