onBindViewHolder 位置再次从 0 开始
onBindViewHolder position is starting again at 0
使用 recyclerview 并首先初始化列表视图,它开始遍历每个项目 1、2、3、4、5,但突然位置值恢复为 0 并从已使用的数据项中获取文本值。 ,因此我在列表中的数据是循环的,看起来像:
0,1,2,4,5,0,1,2,3,4,5
我正在使用 ViewHolder,我正在使用来自 ViewHolder 的位置,在调试项目列表时大小是恒定的并且值是正确的。一切似乎都正确实施了,我认为它是回收价值之类的?在我滚动或点击任何内容之前。
public class AnswerAdapter extends RecyclerView.Adapter<AnswerAdapter.NumberViewHolder> {
List<NumberItem> items;
private SparseBooleanArray selectedItems;
public AnswerAdapter() {
setHasStableIds(true);
SparseBooleanArray localSparseBooleanArray = new SparseBooleanArray();
this.selectedItems = localSparseBooleanArray;
ArrayList localArrayList = new ArrayList();
this.items = localArrayList;
this.items.addAll(AnswerListContent.ITEMS);
}
public void clearSelections() {
this.selectedItems.clear();
notifyDataSetChanged();
}
@Override
public int getItemCount() {
return this.items.size();
}
public NumberItem getItem(int pos) {
return this.items.get(pos);
}
public int getSelectedItemCount() {
return this.selectedItems.size();
}
public List<Integer> getSelectedItems() {
ArrayList localArrayList = new ArrayList(this.selectedItems.size());
for (int i = 0; i < this.selectedItems.size(); i++) {
localArrayList.add(Integer.valueOf(this.selectedItems.keyAt(i)));
}
return localArrayList;
}
@Override
public void onBindViewHolder(NumberViewHolder paramNumberViewHolder, int paramInt) {
NumberItem localNumberItem = items.get(paramNumberViewHolder.getPosition());
paramNumberViewHolder.text.setText(localNumberItem.num.toString());
if (this.selectedItems.get(paramInt, false)) {
paramNumberViewHolder.text.setBackgroundResource(R.drawable.answer_bg_selected);
} else {
paramNumberViewHolder.text.setBackgroundResource(R.drawable.answer_bg);
}
}
public NumberViewHolder onCreateViewHolder(ViewGroup paramViewGroup, int paramInt) {
View localView = LayoutInflater.from(paramViewGroup.getContext()).inflate(R.layout.list_item_answer, paramViewGroup, false);
NumberViewHolder localNumberViewHolder = new NumberViewHolder(localView);
return localNumberViewHolder;
}
public void removeItem(int paramInt) {
this.items.remove(paramInt);
}
public void swapPositions(int paramInt1, int paramInt2) {
Collections.swap(this.items, paramInt1, paramInt2);
}
public void toggleSelection(int pos) {
if (selectedItems.get(pos, false)) {
selectedItems.delete(pos);
} else {
selectedItems.put(pos, true);
}
notifyItemChanged(pos);
}
public final static class NumberViewHolder extends RecyclerView.ViewHolder {
TextView text;
public NumberViewHolder(View localView) {
super(localView);
this.text = ((TextView) localView.findViewById(R.id.title));
}
}
}
onBind 的第二个参数是您应该绑定的位置。
paramInt = position
所以你应该打电话
items.get(position);
不是
items.get(paramNumberViewHolder.getPosition());
您收到的职位可能已过时。 ViewHolder#getPosition 对已经绑定的 ViewHolders 有效。
已解决!对于也遇到此问题的任何人的帮助,问题是:
setHasStableIds(true);
这是我在构造函数中设置的。
事实证明我最初覆盖了 'getItemID'(这将允许列表工作)但是我后来将其删除以支持不同的方法并且忘记删除上述 hasStableId!
使用 recyclerview 并首先初始化列表视图,它开始遍历每个项目 1、2、3、4、5,但突然位置值恢复为 0 并从已使用的数据项中获取文本值。 ,因此我在列表中的数据是循环的,看起来像:
0,1,2,4,5,0,1,2,3,4,5
我正在使用 ViewHolder,我正在使用来自 ViewHolder 的位置,在调试项目列表时大小是恒定的并且值是正确的。一切似乎都正确实施了,我认为它是回收价值之类的?在我滚动或点击任何内容之前。
public class AnswerAdapter extends RecyclerView.Adapter<AnswerAdapter.NumberViewHolder> {
List<NumberItem> items;
private SparseBooleanArray selectedItems;
public AnswerAdapter() {
setHasStableIds(true);
SparseBooleanArray localSparseBooleanArray = new SparseBooleanArray();
this.selectedItems = localSparseBooleanArray;
ArrayList localArrayList = new ArrayList();
this.items = localArrayList;
this.items.addAll(AnswerListContent.ITEMS);
}
public void clearSelections() {
this.selectedItems.clear();
notifyDataSetChanged();
}
@Override
public int getItemCount() {
return this.items.size();
}
public NumberItem getItem(int pos) {
return this.items.get(pos);
}
public int getSelectedItemCount() {
return this.selectedItems.size();
}
public List<Integer> getSelectedItems() {
ArrayList localArrayList = new ArrayList(this.selectedItems.size());
for (int i = 0; i < this.selectedItems.size(); i++) {
localArrayList.add(Integer.valueOf(this.selectedItems.keyAt(i)));
}
return localArrayList;
}
@Override
public void onBindViewHolder(NumberViewHolder paramNumberViewHolder, int paramInt) {
NumberItem localNumberItem = items.get(paramNumberViewHolder.getPosition());
paramNumberViewHolder.text.setText(localNumberItem.num.toString());
if (this.selectedItems.get(paramInt, false)) {
paramNumberViewHolder.text.setBackgroundResource(R.drawable.answer_bg_selected);
} else {
paramNumberViewHolder.text.setBackgroundResource(R.drawable.answer_bg);
}
}
public NumberViewHolder onCreateViewHolder(ViewGroup paramViewGroup, int paramInt) {
View localView = LayoutInflater.from(paramViewGroup.getContext()).inflate(R.layout.list_item_answer, paramViewGroup, false);
NumberViewHolder localNumberViewHolder = new NumberViewHolder(localView);
return localNumberViewHolder;
}
public void removeItem(int paramInt) {
this.items.remove(paramInt);
}
public void swapPositions(int paramInt1, int paramInt2) {
Collections.swap(this.items, paramInt1, paramInt2);
}
public void toggleSelection(int pos) {
if (selectedItems.get(pos, false)) {
selectedItems.delete(pos);
} else {
selectedItems.put(pos, true);
}
notifyItemChanged(pos);
}
public final static class NumberViewHolder extends RecyclerView.ViewHolder {
TextView text;
public NumberViewHolder(View localView) {
super(localView);
this.text = ((TextView) localView.findViewById(R.id.title));
}
}
}
onBind 的第二个参数是您应该绑定的位置。
paramInt = position
所以你应该打电话
items.get(position);
不是
items.get(paramNumberViewHolder.getPosition());
您收到的职位可能已过时。 ViewHolder#getPosition 对已经绑定的 ViewHolders 有效。
已解决!对于也遇到此问题的任何人的帮助,问题是:
setHasStableIds(true);
这是我在构造函数中设置的。
事实证明我最初覆盖了 'getItemID'(这将允许列表工作)但是我后来将其删除以支持不同的方法并且忘记删除上述 hasStableId!