onBindViewHolder位置再次从0开始

时间:2015-02-28 21:15:41

标签: android android-recyclerview

使用recyclelerview并首先初始化列表视图,它开始遍历每个项目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));
    }

 }
}

2 个答案:

答案 0 :(得分:6)

解决!对于遇到此问题的任何人的帮助,问题是:

setHasStableIds(true); 

我在构造函数中设置了哪个。

事实证明我原来已经被覆盖了“getItemID”&#39; (这会让列表工作)但是后来我把它删除了,采用了不同的方法和FORGOT来删除前面提到的hasStableId!

答案 1 :(得分:0)

onBind的第二个参数是你应该绑定的位置。

paramInt = position

所以你应该打电话 items.get(position);items.get(paramNumberViewHolder.getPosition());

你可能会收到一个陈旧的位置。 ViewHolder#getPosition对已经绑定的ViewHolders有效。