Android ListView において、リスト項目を1つのまとまりごとに表示する


ListViewにおいて、リスト項目をひとまとまりごとに表示することに
少し時間がかかったのでメモ。

言葉でなんて説明すればいいのかがわからなかったので、
最初に最終目標を画像で載せます。
こんな感じ↓

では、早速作って行きましょう。

myAdapter
private class myAdapter extends ArrayAdapter<Item> {
        LayoutInflater layoutInflater;
        Item item;

        myAdapter(Context context, int textViewResourceId, List<Item> list) {
            super(context, textViewResourceId, list);
            layoutInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        }

        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            item = getItem(position);

            View view;
            if (item.getList1() != 0) {
                view = layoutInflater.inflate(R.layout.list1, null);
                TextView txt = (TextView) view.findViewById(R.id.list1TextView);
                txt.setText(String.valueOf(item.getList1()));
            } else {
                view = layoutInflater.inflate(R.layout.list2, null);
                TextView txt = (TextView) view.findViewById(R.id.list2TextView);
                txt.setText(String.valueOf(item.getList2()));
            }

            return view;
        }
}

Adapterの作り方はここでは割愛。
下記を参照してください。

AndroidのListViewチュートリアル

ここで重要なのは、
getViewメソッドにおいて、条件によって
Viewに入れるレイアウトを変更している点。
これによって、まとまりを持ったListViewができる
というか、これが今回の一番の肝。
これさえできれば、あとはいつも通り作るだけ!

残りのコード↓

MainActivity
public class MainActivity extends AppCompatActivity {

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

        List<Item> list = new ArrayList<>();

        for (int i = 1; i < 11; i++) {
           for (int j = 0; j < i + 1; j++) {
               Item item = new Item();
               if (j == 0) {
                   item.setList1(i);
                   item.setList2(0);
               } else {
                   item.setList1(0);
                   item.setList2(i);
               }
               list.add(item);
           }
        }

        ListView listView = (ListView) this.findViewById(R.id.ListView);
        myAdapter adapter = new myAdapter(this, R.layout.list1, list);
        listView.setAdapter(adapter);
    }
}

myAdapterのコンストラクタの第2引数で、R.layout.list1を入れてますが、R.layout.list2を代わりに入れても問題なく動作しました。
理由は調べましたが、よくわかりませんでした。
どなたか教えてください。

Item
class Item {
    private int list1;
    private int list2;

    void setList1(int list) {
        this.list1 = list;
    }

    void setList2(int list) {
        this.list2 = list;
    }

    int getList1() {
        return list1;
    }

    int getList2() {
        return list2;
    }
}

レイアウトもこんな感じ↓

activity_main
<ListView
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_alignParentTop="true"
    android:layout_alignParentStart="true"
    android:id="@+id/ListView" />
list1
<TextView
    android:text="リスト"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:id="@+id/textView2"
    android:textSize="30sp"
    android:layout_marginLeft="20dp"
    android:textColor="#FFFFFF"
    android:paddingBottom="10dp"
    android:paddingTop="10dp" />

<TextView
    android:text="1"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:textSize="30sp"
    android:textColor="#FFFFFF"
    android:id="@+id/list1TextView"/>

list2
<TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textSize="30sp"
        android:textColor="#000000"
        android:id="@+id/list2TextView"
        android:text="1"
        android:layout_marginLeft="30dp"
        android:paddingBottom="10dp"
        android:paddingTop="10dp" />

以上です。
最後まで、見ていただきありがとうございました。

もし、ご意見、質問等ございましたら、どんな些細なことでも、厳しいご意見であってもぜひコメント欄にお書きください。
お待ちしております。