Java 滚动时,RecyclerView被弄乱了

Java 滚动时,RecyclerView被弄乱了,java,android,android-recyclerview,Java,Android,Android Recyclerview,正如您在屏幕截图中看到的,我的项目包含一个RecyclerView(用于食品类别),其中包含更多RecyclerViews(用于配料)。但是我遇到了一个问题,我的RecyclerView把订单搞乱了。我调试了项目,参数很好,但是RecyclerView显示错误。如图所示,水果成分显示在乳制品类别中 IngredientSectionAdapter.Java (主适配器,其中包含更多的RecyclerViews) class SectionViewHolder扩展了RecyclerView.Vi

正如您在屏幕截图中看到的,我的项目包含一个
RecyclerView
(用于食品类别),其中包含更多
RecyclerView
s(用于配料)。但是我遇到了一个问题,我的
RecyclerView
把订单搞乱了。我调试了项目,参数很好,但是
RecyclerView
显示错误。如图所示,水果成分显示在乳制品类别中

IngredientSectionAdapter.Java (主适配器,其中包含更多的
RecyclerView
s)

class SectionViewHolder扩展了RecyclerView.ViewHolder{
私有文本视图部分BTN;
私人RecyclerView项目RecyclerView;
公共部分视图持有者(视图项视图){
超级(项目视图);
sectionBtn=(TextView)itemView.findViewById(R.id.text\u类别);
itemRecyclerView=(RecyclerView)itemView.findViewById(R.id.IngCreditsRecycler);
}
}
私人语境;
私有ArrayList部分ModelArrayList;
阵列列表适配器;
public IngreditSectionAdapter(上下文上下文,ArrayList sectionModelArrayList){
this.context=上下文;
this.sectionModelArrayList=sectionModelArrayList;
adapters=newarraylist();
}
@凌驾
公共部分ViewHolder onCreateViewHolder(视图组父级,int-viewType){
LayoutFlater充气机=LayoutFlater.from(上下文);
视图v=充气机。充气(右布局。父列表,空);
返回新的SectionViewHolder(v);
}
@凌驾
BindViewHolder上的公共无效(截面ViewHolder,内部位置){
最终IngreditSectionModel sectionModel=sectionModelArrayList.get(位置);
holder.itemRecyclerView.setTag(holder.itemRecyclerView.getVisibility());
最终回收视图部分列表=holder.itemRecyclerView;
holder.sectionBtn.setText(sectionModel.getSectionLabel());
//项目的回收器视图
holder.itemRecyclerView.setHasFixedSize(true);
holder.itemRecyclerView.setNestedScrollingEnabled(false);
/*根据recyclerview枚举类型设置布局管理器*/
StaggedGridLayoutManager StaggedGridLayoutManager=新的StaggedGridLayoutManager(3,1);
add(新的IngreditItemAdapter(context,sectionModel.getItemArrayList());
int resId=R.anim.grid\u布局\u动画\u从\u底部开始;
//LayoutImationController动画=AnimationUtils.LoadLayoutImation(上下文,剩余);
holder.itemRecyclerView.setLayoutManager(交错排列的布局管理器);
holder.itemRecyclerView.setAdapter(adapters.get(position));
//holder.itemRecyclerView.SetLayoutImation(动画);
//切换内部回收视图的可视性(成分,而不是类别)
holder.sectionBtn.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图v){
if(sectionList.getVisibility()==View.VISIBLE){
sectionList.setVisibility(View.GONE);
}
其他的
{
sectionList.setVisibility(View.VISIBLE);
}
}
});
}

这是什么原因?

每次调用
onBindViewHolder
时,您都要创建一个新的
IngRedentiteAdapter
并将其添加到
适配器中,然后调用
holder.itemRecyclerView.setAdapter(adapters.get(position))
。但是,
adapters.get(position)
不是您刚刚创建的适配器。你的适配器会越来越大。试试这个

IngredientItemAdapter adapter = adapters.get(position);
adapter.setIngredients(sectionModel.getItemArrayList());
holder.itemRecyclerView.setAdapter(adapter);

当列表第一次显示时,或者当您滚动到底部并返回时,问题是否存在?请尝试使用
getItemId()
getItemViewType()
。这些函数修复了RecyclerView中有关订单和位置的许多问题
IngredientItemAdapter adapter = adapters.get(position);
adapter.setIngredients(sectionModel.getItemArrayList());
holder.itemRecyclerView.setAdapter(adapter);