Expandablerecyclerviewのexpand()とcollapse()の注意点

# はじめに
Expandablerecyclerviewの親viewにて「もっと見る」⇔「閉じる」を繰り返したい．
こんな感じ．

<img width="300dp" alt="device.gif" src="https://qiita-image-store.s3.amazonaws.com/0/129578/27e89e5d-f314-d8dd-8119-1f45f9b8d65d.gif">

# 前提
まずこちらを参考にして各ファイルを実装する．
http://qiita.com/iKASiH/items/6707f9062e2e4bc48696

# 実装

## 必要ファイル
- layout file
    - recyclerview.xml
    - parent_item.xml
    - child_item.xml
- java function file
    - Parent_ViewHolder.java
    - Child_ViewHolder.java
    - Home_Adapter.java
    - MainActivity.java
- java entity file
    - Home.java
    - Child.java
    - Parent.java
    
## 追加機能
- layout file
    - 目がチカチカするので背景色を削除(`parent_item.xml` ，`recyclerview.xml`)
    - 最初は全て閉まっているので全てにもっと見るを配置(`parent_item.xml`)
- function file
    - 広げたときにtextを閉じるに変換(`Parent_ViewHolder.xml`)
    - 縮めたときにtextをもっと見るに変換(`Parent_ViewHolder.xml`)
- java entity file
    - 改変無し(そのまま用いる)

では実装します．

## レイアウト(layoutfile)

```xml:recyclerview.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="wrap_content">
    <android.support.v7.widget.RecyclerView
        android:id="@+id/recyclerview"
        android:scrollbars="vertical"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />
</LinearLayout>
```

```xml:parent_item.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="wrap_content">
    <TextView
        android:gravity="center"
        android:id="@+id/parenttext"
        android:text="開く"
        android:layout_width="match_parent"
        android:layout_height="?attr/actionBarSize" />
</LinearLayout>
```

```xml:child_item.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="wrap_content">
    <TextView
        android:id="@+id/childtext"
        android:layout_width="match_parent"
        android:layout_height="?attr/actionBarSize" />
</LinearLayout>
```

## 機能(function file)
```java:Parent_ViewHolder
package jp.app.oomae.hisaki.expandable_recyclerview;

import android.view.View;
import android.widget.TextView;
import com.thoughtbot.expandablerecyclerview.viewholders.GroupViewHolder;

public class Parent_ViewHolder extends GroupViewHolder {

    private TextView text1;

    public Parent_ViewHolder(View itemView) {//親viewのid取得
        super(itemView);
        text1 = (TextView)itemView.findViewById(R.id.parenttext);
    }
    public void open(){
        text1.setText("閉じる");
    }
    public void close(){
        text1.setText("開く");
    }

    @Override//広がる時呼ばれる
    public void expand() {
        open();
    }
    @Override//縮ませた時呼ばれる
    public void collapse() {
        close();
    }
}

```

いざ実行！！

<img width="300dp" alt="device.gif" src="https://qiita-image-store.s3.amazonaws.com/0/129578/4360bbf5-fe54-26c0-ca55-18c0d6086f02.gif">

開いていないのに「閉じる」になっていたり...
開いているのに「開く」になっていたり...:tired_face:

## 解決策
解決策は，スクロール毎に開いているかを判定してtextを反映する．

```java:Home_Adapter.java
package jp.app.oomae.hisaki.expandable_recyclerview;

import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

import com.thoughtbot.expandablerecyclerview.ExpandCollapseController;
import com.thoughtbot.expandablerecyclerview.ExpandableRecyclerViewAdapter;
import com.thoughtbot.expandablerecyclerview.models.ExpandableGroup;

import java.util.List;

public class Home_Adapter extends ExpandableRecyclerViewAdapter<Parent_ViewHolder, Child_ViewHolder> {

    private ExpandCollapseController expandCollapseController;

    public Home_Adapter(List<? extends ExpandableGroup> groups) {
        super(groups);
        this.expandCollapseController = new ExpandCollapseController(expandableList, this);
    }

    @Override
    public Parent_ViewHolder onCreateGroupViewHolder(final ViewGroup parent, final int viewType) {
        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.parent_item, parent, false);
        return new Parent_ViewHolder(view);
    }

    @Override
    public Child_ViewHolder onCreateChildViewHolder(ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.child_item, parent, false);
        return new Child_ViewHolder(view);
    }

    @Override
    public void onBindGroupViewHolder(Parent_ViewHolder holder, int flatPosition, ExpandableGroup group) {
        /*--------------ここを追加---------------*/
        if(isGroupExpanded(flatPosition)){
            holder.open();
        }
        else{
            holder.close();
        }
        /*---------------------------------------*/
    }

    @Override
    public void onBindChildViewHolder(Child_ViewHolder holder, int flatPosition, ExpandableGroup group, int childIndex) {
    }
}
```

このライブラリにはisGroupExpandedメソッドが存在して，このメソッドは，開いている状態か開いていない状態かを判定してくれます．
flatpositionを引数にすると，親viewの状態によってtrue or falseがreturnされます．
それを用いてtextを再反映します．
これで完成です．結構焦りました．:frowning2:

是非，コメントよろしくお願いします．

Github : https://github.com/hisakioomae/Expandable_Recyclerview_sample