Help us understand the problem. What is going on with this article?

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

More than 1 year has passed since last update.

概要

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

Screenshot_1500765377.png

方法

1. assetsディレクトリの作成

スクリーンショット 2017-07-23 9.17.14.png
app直下にassetsディレクトリを作成し、その下に読み込ませたいcsvを設置します。

2. CSVReaderクラスの作成

CSVを読み込ませるクラスを作ります。

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) {

                //カンマ区切りで1つづつ配列に入れる
                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を持つクラスを作ります

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を作るときのように実装します。
今回はサンプルなので何の工夫もない、並べただけのレイアウトです。

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に値を格納します。

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を表示する

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

mii-chang
モバイルアプリエンジニア
iotlt
IoT縛りの勉強会です。 毎月イベントを実施しているので是非遊びに来てください! 登壇者を中心にQiitaでも情報発信していきます。 https://iotlt.connpass.com
https://iotlt.connpass.com/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした