2017-12-30 41 views
0

Wie Sie auf dem Screenshot sehen können, enthält mein Projekt eine RecyclerView (für Kategorien von Lebensmitteln), die mehr enthält RecyclerView s (für die Zutaten). Aber Iv'e hat ein Problem, mein RecyclerView bringt die Bestellung durcheinander. Ich debugge das Projekt und die Parameter sind in Ordnung, aber die RecyclerView zeigt sie falsch an. Wie Sie auf dem Bild sehen können, werden Obstbestandteile in der Kategorie Milchprodukte angezeigt.RecyclerView ist beim Scrollen durcheinander

image which display the problem of the RecyclerView messed up

IngredientSectionAdapter.Java (Hauptteil, der mehr RecyclerView s enthalten)

class SectionViewHolder extends RecyclerView.ViewHolder { 
    private TextView sectionBtn; 
    private RecyclerView itemRecyclerView; 

    public SectionViewHolder(View itemView) { 
     super(itemView); 
     sectionBtn = (TextView) itemView.findViewById(R.id.text_category); 
     itemRecyclerView = (RecyclerView) itemView.findViewById(R.id.ingredientsRecycler); 
    } 
} 

private Context context; 
private ArrayList<IngredientSectionModel> sectionModelArrayList; 
ArrayList<IngredientItemAdapter> adapters; 

public IngredientSectionAdapter(Context context, ArrayList<IngredientSectionModel> sectionModelArrayList) { 
    this.context = context; 
    this.sectionModelArrayList = sectionModelArrayList; 
    adapters = new ArrayList<IngredientItemAdapter>(); 
} 

@Override 
public SectionViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
    LayoutInflater inflater = LayoutInflater.from(context); 
    View v = inflater.inflate(R.layout.parent_list,null); 
    return new SectionViewHolder(v); 
} 

@Override 
public void onBindViewHolder(SectionViewHolder holder, int position) { 
    final IngredientSectionModel sectionModel = sectionModelArrayList.get(position); 
    holder.itemRecyclerView.setTag(holder.itemRecyclerView.getVisibility()); 
    final RecyclerView sectionList = holder.itemRecyclerView; 
    holder.sectionBtn.setText(sectionModel.getSectionLabel()); 

    //recycler view for items 
    holder.itemRecyclerView.setHasFixedSize(true); 
    holder.itemRecyclerView.setNestedScrollingEnabled(false); 

    /* set layout manager on basis of recyclerview enum type */ 

    StaggeredGridLayoutManager staggeredGridLayoutManager = new StaggeredGridLayoutManager(3,1); 
    adapters.add(new IngredientItemAdapter(context, sectionModel.getItemArrayList())); 
    int resId = R.anim.grid_layout_animation_from_bottom; 
    //LayoutAnimationController animation = AnimationUtils.loadLayoutAnimation(context, resId); 
    holder.itemRecyclerView.setLayoutManager(staggeredGridLayoutManager); 
    holder.itemRecyclerView.setAdapter(adapters.get(position)); 
    //holder.itemRecyclerView.setLayoutAnimation(animation); 

    //toggle visibilty of inner RecyclerView (ingredients, not categories) 
    holder.sectionBtn.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      if (sectionList.getVisibility() == View.VISIBLE){ 
       sectionList.setVisibility(View.GONE); 
      } 
      else 
      { 
       sectionList.setVisibility(View.VISIBLE); 
      } 
     } 
    }); 

} 

Was kann die Ursache sein?

+0

Ist das Problem vorhanden, wenn die Liste zuerst angezeigt wird, oder wenn Sie nach unten und zurück scrollen? – elmorabea

+0

versuchen Sie es mit 'getItemId()' und 'getItemViewType()'. Diese Funktion löst viele Probleme bei Bestellungen und Positionen in ** RecyclerView ** –

Antwort

1

Jedes Mal onBindViewHolder wird eine neue IngredientItemAdapter erstellen genannt und fügen Sie sie adapters, und rufen Sie dann holder.itemRecyclerView.setAdapter(adapters.get(position)). adapters.get(position) ist jedoch nicht der Adapter, den Sie gerade erstellt haben. Dein Adapter wird größer und größer. Versuchen Sie diese

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