2017-01-20 6 views
1

Я хочу использовать Recyclerview с двумя разными строками, чтобы показывать категории. Первая строка является Parentcategory и должна быть представлена ​​как Listheader. Parentcategorys может содержать ноль, один или несколько дочерних элементов, которые должны представлять другие, кроме родителя.Android RecyclerView с различными ViewRows

Мои данные хранятся в ArrayAdapter, который выглядит следующим образом. (The Key Категория является ParentCategory в то время как списки представляют ребенок.

private ArrayMap<Category, List<Category>> categoryMap= new ArrayMap<>(); 

Я искал много и судимые много, как в this нити или this one и this. Но все это не работает для . мне

Edit: Моя проблема заключается в том, что данные не отображаются корректно, например:.... у меня есть 4 Parentcategories Второй parentcategory имеет 2 детей

Мои данные выглядит следующим образом

  • Родитель
  • Родитель
    • Детский
    • Детский
  • Родитель
  • Родитель

Но мой список показывает это:

  • Родитель
  • Родитель
    • Детский
  • Родитель

Я также попытался использовать ExpandableListView и ListViews. Но этого я не хотел.

Мой адаптер выглядит в настоящее время следующим образом:

public class CategoryListAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> { 
private static final int TYPE_HEADER = 0; 
private static final int TYPE_ITEM = 1; 

private ArrayMap<Category,List<Category>> categoryMap; 
private Context context; 
private ArrayList<Category> categoryArrayList; 


public CategoryListAdapter(Context context, ArrayMap<Category, List<Category>> categoryMap) { 
    this.context = context; 
    this.categoryMap = categoryMap; 
} 

@Override 
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
    Log.d("VIEWTYPE",""+viewType); 
    switch (viewType){ 
     case TYPE_HEADER: 
      CategoryListParentBinding binding = DataBindingUtil.inflate(
        LayoutInflater.from(parent.getContext()), 
        R.layout.category_list_parent, parent, false); 
      return new HeaderViewHolding(binding); 
     case TYPE_ITEM: 
       CategoryListChildBinding binding1 = DataBindingUtil.inflate(
         LayoutInflater.from(parent.getContext()), 
         R.layout.category_list_child, parent, false); 
       return new ChildViewHolding(binding1); 
    } 
    throw new RuntimeException("there is no type that matches the type " + viewType + " + make sure your using types correctly"); 
} 

@Override 
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { 
    if(holder instanceof HeaderViewHolding){ 
     CategoryListParentBinding parentBinding = ((HeaderViewHolding) holder).parentBinding; 
     parentBinding.setParentCategory(categoryMap.keyAt(position)); 
    } 
    if(holder instanceof ChildViewHolding){ 
     for(int i = 0; i<=categoryMap.valueAt(position).size()-1;i++){ 
      CategoryListChildBinding childBindingBinding = ((ChildViewHolding) holder).childBinding; 
      childBindingBinding.setChildCategory(categoryMap.valueAt(position).get(i)); 
     } 
    } 
} 

@Override 
public int getItemViewType(int position) { 
    if(isPositionHeader(position)) 
     return TYPE_HEADER; 
    return TYPE_ITEM; 
} 

private boolean isPositionHeader(int position) { 
    return categoryMap.valueAt(position).size() <= 0; 
} 


@Override 
public int getItemCount() { 
    int count = categoryMap.size(); 
    for(int i=0;i<=categoryMap.size()-1;i++){ 
     count = count + categoryMap.valueAt(i).size(); 
    } 
    return count; 
} 

static class HeaderViewHolding extends RecyclerView.ViewHolder { 
    CategoryListParentBinding parentBinding; 
    public HeaderViewHolding(CategoryListParentBinding parentBinding) { 
     super(parentBinding.categoryParentLayout); 
     this.parentBinding = parentBinding; 
    } 
} 

static class ChildViewHolding extends RecyclerView.ViewHolder { 
    CategoryListChildBinding childBinding; 
    public ChildViewHolding(CategoryListChildBinding childBinding) { 
     super(childBinding.categoryChildLayout); 
     this.childBinding = childBinding; 
    } 
} 
} 

Может кто-нибудь мне помочь?

+0

Неясно, в чем проблема, которую вы испытываете – Kuffs

+0

«Не работает для меня» не является правильной инструкцией. Какая ошибка вы получаете или какое поведение вы видите? –

+0

ooh ok sry i'am new here, и не знаю, как описать мою проблему. Все эти примеры упоминаются для перезаписывания метода getItemViewType, но я не могу различать типы представлений, потому что я сохранил свои данные в ArrayMap. Я не ошибаюсь. Но в списке не отображаются правильные данные. Например. У меня есть список с 4 родительскими категориями. Второй родитель имеет 2 детей. В списке указаны 3 родителя и только один ребенок. – KingOA

ответ

0

Проблема в ArrayMap, вместо этого используйте HashMap. ArrayMap сортирует данные по их типу: |