Android RecyclerView中已还原项目的顺序错误
我使用RecyclerView作为我的数据列表的基础,在我的适配器中,元素被添加到列表中。列表将始终以指定顺序最多包含10个元素。以下是我的适配器的添加方法:Android RecyclerView中已还原项目的顺序错误,android,android-recyclerview,android-adapter,Android,Android Recyclerview,Android Adapter,我使用RecyclerView作为我的数据列表的基础,在我的适配器中,元素被添加到列表中。列表将始终以指定顺序最多包含10个元素。以下是我的适配器的添加方法: void addResult(Result result) { int resultPosition = result.getType().getPos(); boolean inserted = false; for (int i = 0; i < results.size(); i++) {
void addResult(Result result) {
int resultPosition = result.getType().getPos();
boolean inserted = false;
for (int i = 0; i < results.size(); i++) {
Result currentField = results.get(i);
if (currentField.getType().getPos() > resultPosition) {
results.add(i, result);
inserted = true;
notifyItemInserted(i);
break;
}
}
if (!inserted) {
results.add(result);
notifyItemInserted(results.size());
}
}
@Override
public ResultHolder onCreateViewHolder(ViewGroup viewGroup, int viewType) {
View view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.list_item, viewGroup, false);
return new ResultHolder(view);
}
@Override
public void onBindViewHolder(ResultHolder resultHolder, int position) {
Result result = results.get(position);
resultHolder.bindResultData(result);
}
@Override
public int getItemCount() {
return results.size();
}
当您将一个项目添加到列表中间时,您刚才添加的项目后面的所有项目的索引都将更新 试试这个:
for (int i = 0; i < results.size(); i++) {
Result currentField = results.get(i);
if (currentField.getType().getPos() > resultPosition) {
results.add(i, result);
inserted = true;
notifyItemInserted(i);
notifyItemRangeInserted(i, results.size - i);
break;
}
}
当您将一个项目添加到列表中间时,您刚才添加的项目后面的所有项目的索引都将更新 试试这个:
for (int i = 0; i < results.size(); i++) {
Result currentField = results.get(i);
if (currentField.getType().getPos() > resultPosition) {
results.add(i, result);
inserted = true;
notifyItemInserted(i);
notifyItemRangeInserted(i, results.size - i);
break;
}
}
解决方案是不要使用
onBindViewHolder
传递的位置来迭代结果列表
在返回与每个视图持有者关联的位置后,调用getItemViewType(position)
,并使用它来迭代列表:
@Override
public int getItemViewType(int position) {
return position;
}
事实上,视图持有者不是按顺序保存的,与
onBindViewHolder
提供的顺序无关。通过调用getItemViewHolder
实际上是将位置与每个视图持有者关联起来。解决方案是不要使用onBindViewHolder
传递的位置来迭代结果列表
在返回与每个视图持有者关联的位置后,调用getItemViewType(position)
,并使用它来迭代列表:
@Override
public int getItemViewType(int position) {
return position;
}
事实上,视图持有者不是按顺序保存的,与
onBindViewHolder
提供的顺序无关。通过调用getItemViewHolder
您实际上是将职位与每个视图持有人关联起来。请添加适配器的代码我编辑了我的后期请添加适配器的代码我编辑了我的后期谢谢您的帮助,但它不起作用。根据你的第一个建议,我得到一个IndexOutOfBoundsException,第二个建议,如果在设备旋转后,项目仍然处于错误的顺序。谢谢你的帮助,但它不起作用。根据你的第一个建议,我得到了一个IndexOutOfBoundsException,而根据第二个建议,如果在设备旋转之后,项目仍然处于错误的顺序。