AndroidでCSVファイルを読み込んでリスト表示する

## 概要
CSVで作られたデータセットをまとめて読み込ませたい場面が有りました。
今回はサンプルとして読み込ませたデータをリスト表示させました。

![Screenshot_1500765377.png](https://qiita-image-store.s3.amazonaws.com/0/93899/a321fdf7-6561-e968-44ec-f65c1364cc2a.png)


## 方法
### 1. assetsディレクトリの作成
<img width="311" alt="スクリーンショット 2017-07-23 9.17.14.png" src="https://qiita-image-store.s3.amazonaws.com/0/93899/7ad1791c-d202-5509-a9be-6e0020fb11cb.png">
app直下にassetsディレクトリを作成し、その下に読み込ませたいcsvを設置します。

### 2. CSVReaderクラスの作成
CSVを読み込ませるクラスを作ります。

```java:CsvReader.java
public class CsvReader {
    List<ListData> objects = new ArrayList<ListData>();
    public void reader(Context context) {
        AssetManager assetManager = context.getResources().getAssets();
        try {
            // CSVファイルの読み込み
            InputStream inputStream = assetManager.open("data.csv");
            InputStreamReader inputStreamReader = new InputStreamReader(inputStream);
            BufferedReader bufferReader = new BufferedReader(inputStreamReader);
            String line;
            while ((line = bufferReader.readLine()) != null) {

                //カンマ区切りで１つづつ配列に入れる
                ListData data = new ListData();
                String[] RowData = line.split(",");

                //CSVの左([0]番目)から順番にセット
                data.setId(RowData[0]);
                data.setName(RowData[1]);
                data.setYomi(RowData[2]);
                data.setKentyo(RowData[3]);
                data.setYomi_kentyo(RowData[4]);

                objects.add(data);
            }
            bufferReader.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
```

### 3.Listに表示させたいオブジェクトを作る
GetterとSetterを持つクラスを作ります

```java:ListData.java
public class ListData {
    String id;
    String name;
    String yomi;
    String kentyo;
    String yomi_kentyo;

    public void setId(String id){
        this.id = id;
    }

    public String getId(){
        return id;
    }

    public void setName (String name){
        this.name = name;
    }

    public String getName(){
        return name;
    }

    public void setYomi(String yomi){
        this.yomi = yomi;
    }

    public  String getYomi(){
        return yomi;
    }

    public void setKentyo(String kentyo){
        this.kentyo = kentyo;
    }

    public String getKentyo(){
        return kentyo;
    }

    public void setYomi_kentyo(String yomi_kentyo){
        this.yomi_kentyo = yomi_kentyo;
    }

    public String getYomi_kentyo(){
        return yomi_kentyo;
    }
}
```

### 4. Listの行に使うレイアウトを作る
普通にカスタムなListViewを作るときのように実装します。
今回はサンプルなので何の工夫もない、並べただけのレイアウトです。

```xml:list_item.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              android:layout_width="match_parent"
              android:layout_height="match_parent"
              android:orientation="vertical">

    <TextView
        android:id="@+id/id"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        />

    <TextView
        android:id="@+id/name"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"/>

    <TextView
        android:id="@+id/yomi"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"/>

    <TextView
        android:id="@+id/kentyo"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"/>

    <TextView
        android:id="@+id/yomi_kentyo"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"/>
</LinearLayout>
```

### 5.Adapterを作って値を格納
AdapterでListViewに値を格納します。

```java:ListViewAdapter.java
public class ListViewAdapter extends ArrayAdapter<ListData> {
    private LayoutInflater layoutInflater;

    public ListViewAdapter(Context context, int resource, List<ListData> objects) {
        super(context, resource, objects);
        layoutInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    }

    @NonNull
    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        ListData data = (ListData)getItem(position);
        if (null == convertView) {
            convertView = layoutInflater.inflate(R.layout.list_item, null);
        }

        TextView idText;
        TextView nameText;
        TextView yomiText;
        TextView kentyoText;
        TextView yomi_kentyoText;

        idText = (TextView)convertView.findViewById(R.id.id);
        nameText = (TextView)convertView.findViewById(R.id.name);
        yomiText = (TextView)convertView.findViewById(R.id.yomi);
        kentyoText = (TextView)convertView.findViewById(R.id.kentyo);
        yomi_kentyoText = (TextView)convertView.findViewById(R.id.yomi_kentyo);

        idText.setText(data.getId());
        nameText.setText(data.getName());
        yomiText.setText(data.getYomi());
        kentyoText.setText(data.getKentyo());
        yomi_kentyoText.setText(data.getYomi_kentyo());

        return convertView;
    }
}
```

### 6.ListViewを表示する

```java:MainActivity.java
public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        CsvReader parser = new CsvReader();
        parser.reader(getApplicationContext());
        ListViewAdapter listViewAdapter = new ListViewAdapter(this, 0, parser.objects);
        ListView listView = (ListView)findViewById(R.id.list);
        listView.setAdapter(listViewAdapter);
    }
}
```

### 7. 完成~
完成です。
![Screenshot_1500765377.png](https://qiita-image-store.s3.amazonaws.com/0/93899/71023b9e-a66d-0fa6-08e9-da4fcff81ec9.png)