読者です 読者をやめる 読者になる 読者になる

とりあえず移転してみました

ニュースねたや、IT系の記事を書いていくつもり・・・ですが、どうなるかわかりません。まあ、とりあえず やってみます。

android ListViewでのはまりポイント

カスタムアダプターでListView

ListViewを使って、リスト形式の表示を行う場合が多いのだけど、色々とはまってしまった。
ListViewは、単純なテキストをリスト形式するのは簡単なのだけど、ちょっとカスタムしようとする場合は、カスタムしたクラスやレイアウトが必要になってくる。

ネットでも沢山情報があるので、基本的なところはできるのだが・・・

ArrayAdapterを継承したカスタムクラスを作成

CustomAdapter
public class CustomAdapter extends ArrayAdapter {
    private LayoutInflater layoutInflater_;

    public CustomAdapter(Context context, int textViewResourceId, List<String> objects) {
        super(context, textViewResourceId, objects);
        layoutInflater_ = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {


        if (convertView == null) {
                convertView = layoutInflater_.inflate(R.layout.rowdata_list, null);
        }

        ArrayList<String> item = (ArrayList<String>)getItem(position);

                TextView textView1;
                TextView textView2;
                textView1 = (TextView) convertView.findViewById(R.id.XXX);
                textView1.setText(item.get(1).toString());
                textView2 = (TextView) convertView.findViewById(R.id.XXX);
                textView2.setText(item.get(2).toString());

        return convertView;
    }
}

R.layout.rowdata_listというレイアウトファイルも作成

レイアウトファイル
<?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="match_parent">

    <LinearLayout
        android:orientation="horizontal"
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <TextView
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:textAppearance="?android:attr/textAppearanceMedium"
            android:text="Medium Text"
            android:id="@+id/textView1"
            android:layout_weight="3"
            android:textColor="@android:color/black"
            android:textSize="10sp" />

        <TextView
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:textAppearance="?android:attr/textAppearanceMedium"
            android:text="Medium Text"
            android:id="@+id/textView2"
            android:layout_weight="1"
            android:textColor="@android:color/black"
            android:textSize="10sp" />
    </LinearLayout>
</LinearLayout>

単純にTextViewが2つ並んでいるレイアウト・・・この部分を変更することで、レイアウトの変更も可能。

使う時は、CustomAdapterを使う。表示するListViewは(R.id.listView1)として指定している。

使う時のコード例
CustomAdapter adapter = new CustomAdapter(getContext(),0,listData);//listDataは表示させるデータ
                ListView listView = (ListView)findViewById(R.id.listView1);
                listView.setAdapter(adapter);

カスタムアダプターを使う場合は、色々と用意するものがあるけど、一度作れば使いまわせる。

はまったのは、カスタムアダプターを使わない場合。
カスタムアダプターは、ArrayAdapterを継承している。ArrayAdapterだけでも、単純なものでは使える。

ArrayAdapterでの使用例(失敗パターン)
ArrayAdapter adapter = new ArrayAdapter(getContext(),0,listData);
      ListView listView = (ListView)findViewById(R.id.listView1);
            listView.setAdapter(adapter);

CustomAdapterを使わずにArrayAdapterで指定してみた。
ここではまってしまった。テストをしてみるとアプリが落ちてしまう・・・しばらく原因がわからなかった。
ArrayAdapterを調べてみると、2つの引数が間違っていた・・・ここは、レイアウトファイルを指定しなければいけない。
カスタムアダプターと違うのだ。

R.layout.rowdataというファイルを新たに作成

<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent" android:layout_height="match_parent"
    android:background="@android:color/holo_blue_bright"
    android:padding="3dp">
</TextView>

TextViewが1つしかない単純なレイアウト・・・

ArrayAdapterでの使用例(成功パターン)
ArrayAdapter adapter = new ArrayAdapter(getContext(),R.layout.rowdata,listData);
      ListView listView = (ListView)findViewById(R.id.listView1);
            listView.setAdapter(adapter);

通常の場合でも、レイアウトファイルはいるのか・・・(面倒だ)

次に、カスタムアダプターに戻って、2行や3行のレイアウトはできるだろうか?リストによっては、1つの行の中で色々と表示したい場合がある。複数行にまたがる場合も当然あるだろうし、表示するものが多い場合もある。ウェブで見れるのはアイコンがあったり、2行くらいしなかない。

そこで、複数行のがいけるのか?やってみた。

結果としては、出来た。ファイルが長くなるので貼り付けはしないけど、LinerLayoutの下にLinerLayoutを4つ配置しても表示された。
そのレイアウトファイルをカスタムアダプターの中で読み出してあげればいい。
R.layout.rowdata_listの部分を変更する。もしくは、R.layout.rowdata_list自体を変更してもいい。