2017-01-20 61 views
1

我想使用具有兩個不同行的RecyclerView來顯示類別。第一行是一個Parentcategory,應該表示爲Listheader。 Parentcategorys可以包含零個,一個或多個孩子,這些孩子應該代表父母以外的其他孩子。具有不同ViewRows的Android RecyclerView

我的數據存儲在一個看起來像這樣的ArrayAdapter中。 (核心範疇是ParentCategory同時列出代表孩子。

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

我已經搜查了很多,tryed很多,像this線程,或this onethis,但是這一切都沒有了工作。我

編輯:我的問題是數據無法正確顯示。例如:。 我有4個Parentcategories第二parentcategory有2個孩子

我的數據是這樣的

  • 家長
  • 家長
    • 兒童
    • 兒童
  • 家長
  • 家長

但我的列表顯示了這一點:

  • 家長
  • 家長
    • 兒童
  • 家長

我還試圖用ExpandableListView和列表視圖。但這不是我想要的。目前

我的適配器是這樣的:

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我是新來的,不知道如何描述我的問題。所有這些例子都提到覆蓋方法getItemViewType,但我不能區分視圖類型,因爲我已經將數據存儲在一個ArrayMap中。我沒有得到任何錯誤。但列表不顯示正確的數據。例如。我有一個包含4個parentCategorys的列表。第二個父母有2個孩子。該列表顯示3位父母和只有一個孩子。 – KingOA

回答

0

問題是ArrayMap,而不是使用HashMap。 ArrayMap根據它們的類型對數據進行排序:|