2016-08-30 35 views
1

iOSでは、データ構造にの2つのレベルのがある場合、 'sections'、 'rows'、そしてUITableViewはデータを表示するのに適しています。RecycleViewで階層的なデータ構造を表示するには?

numberOfSectionsInTableView(tableView: UITableView) -> Int  
tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int 

最初の方法では、セクションの数、2番目に特定のセクションの行の数が必要です。

この方法はAndroidにはありますか?

enter image description here

+1

(HTTP [ 'RecyclerView'増やす使用可能なライブラリ]の多く:// android-arsenal.com/tag/199)は、ヘッダー/セクションまたはツリースタイルの「展開可能な」システムを提供します。 – CommonsWare

+1

おそらく[これ](http://stacktips.com/tutorials/android/listview-with-section-header-in-android)があなたが探しているものです。 ** cons **:あなた自身でヘッダーのタイトルを管理する必要があります。 **プロ**:ソリューションには追加のライブラリは必要ありません。 – j2ko

答えて

0

ライブラリSectionedRecyclerViewAdapterを使用して、データをセクションにグループ化することができます。あなたのセクションでRecyclerViewを設定すると

class MySection extends StatelessSection { 

    String title; 
    List<String> list; 

    public MySection(String title, List<String> list) { 
     // call constructor with layout resources for this Section header, footer and items 
     super(R.layout.section_header, R.layout.section_item); 

     this.title = title; 
     this.list = list; 
    } 

    @Override 
    public int getContentItemsTotal() { 
     return list.size(); // number of items of this section 
    } 

    @Override 
    public RecyclerView.ViewHolder getItemViewHolder(View view) { 
     // return a custom instance of ViewHolder for the items of this section 
     return new MyItemViewHolder(view); 
    } 

    @Override 
    public void onBindItemViewHolder(RecyclerView.ViewHolder holder, int position) { 
     MyItemViewHolder itemHolder = (MyItemViewHolder) holder; 

     // bind your view here 
     itemHolder.tvItem.setText(list.get(position)); 
    } 

    @Override 
    public RecyclerView.ViewHolder getHeaderViewHolder(View view) { 
     return new SimpleHeaderViewHolder(view); 
    } 

    @Override 
    public void onBindHeaderViewHolder(RecyclerView.ViewHolder holder) { 
     MyHeaderViewHolder headerHolder = (MyHeaderViewHolder) holder; 

     // bind your header view here 
     headerHolder.tvItem.setText(title); 
    } 
} 

第一部クラスを作成

// Create an instance of SectionedRecyclerViewAdapter 
SectionedRecyclerViewAdapter sectionAdapter = new SectionedRecyclerViewAdapter(); 

// Create your sections with the list of data for each year 
MySection section1 = new MySection("A", firstDataList); 
MySection section2 = new MySection("B", secondDataList); 

// Add your Sections to the adapter 
sectionAdapter.addSection(section1); 
sectionAdapter.addSection(section2); 

// Set up your RecyclerView with the SectionedRecyclerViewAdapter 
RecyclerView recyclerView = (RecyclerView) findViewById(R.id.recyclerview); 
recyclerView.setLayoutManager(new LinearLayoutManager(getContext())); 
recyclerView.setAdapter(sectionAdapter); 
1

あなたは、2(またはそれ以上)を扱うrecycleviewのためにリスト項目の種類を独自のアダプタを作成します(あなたが望む方法で)リストに追加して、アダプタに渡すことができます。

1

RecyclerView.Adapterは、すぐに複数のビュータイプをサポートします。特定の位置に表示する項目の種類はあなた次第です。

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

はその後、あなたはそれを利用するために、適切なレイアウトを膨らませるonCreateViewHolderを使用してonBindViewHolderすることができます:あなたはTYPE_HEADERとTYPE_ITEM 2つの項目の種類を定義する場合は、簡単に、たとえば、セクションを作成するためにそれを使用することができます。

@Override 
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
    if (viewType == TYPE_HEADER) { 
     View v = ... ; // inflate here 
     return new HeaderViewHolder(v); 
    } else { 
     View v = ... ; // inflate here 
     return new ItemViewHolder(v); 
    }  
} 

@Override 
public void onBindViewHolder(ViewHolder holder, int position) { 
    if (holder instanceof HeaderViewHolder) { 
     // handle header 
    } else if (holder instanceof ItemViewHolder { 
     // handle item 
    } 
} 

任意のデータ構造を使用できます。私は自分の実装の木のような構造を使うか、単純なArrayListとinstanceofを使ってitemがヘッダかコンテンツかを検出する方が好きです。

関連する問題