すごくシンプルなListViewの実装
adapterにセットする、個別行用のレイアウトファイルが必要ですが、ANDROIDがデフォルトで用意している、android.R.layout.simple_list_item_1を使っている。ただTextViewが1つ入っているだけのもの。
activity_main.xml
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/activity_main" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" tools:context="com.logicky.listview.MainActivity"> <ListView android:layout_width="match_parent" android:layout_height="match_parent" android:layout_alignParentTop="true" android:layout_centerHorizontal="true" android:id="@+id/listview" /> </RelativeLayout>
MainActivity.java
public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1); adapter.add("Apple"); adapter.add("Orange"); adapter.add("Coffee"); ListView view = (ListView)findViewById(R.id.listview); view.setAdapter(adapter); } }
android.R.layout.simple_list_item_1
<?xml version="1.0" encoding="utf-8"?> <TextView xmlns:android="http://schemas.android.com/apk/res/android" android:id="@android:id/text1" android:layout_width="match_parent" android:layout_height="wrap_content" android:textAppearance="?android:attr/textAppearanceListItemSmall" android:gravity="center_vertical" android:paddingStart="?android:attr/listPreferredItemPaddingStart" android:paddingEnd="?android:attr/listPreferredItemPaddingEnd" android:minHeight="?android:attr/listPreferredItemHeightSmall" />
Adapterのインスタンスをつくる。つくるときに、個別行用のレイアウトファイルも指定する。 Adapterにデータを追加する。 ListViewを取得して、アダプタをセットする。
行データを配列で与える場合
public class MainActivity extends AppCompatActivity { private ListView view; private static final String[] foods = {"Apple", "Orange", "Coffee"}; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, foods); view = (ListView)findViewById(R.id.listview); view.setAdapter(adapter); } }
自作アダプタ
Foodクラスのデータをリスト表示するListViewを作る。表示項目は、Food名と値段。
ArrayAdapterを継承したMyAdapterクラスを作成し、getViewでFood名と値段を取得・セットする。 個別行データ用のレイアウトは、row.xmlに作成する。row.xmlは単純なテキストビュー2個だけのもの。
MyAdapter.java
public class MyAdapter extends ArrayAdapter<Food> { private final LayoutInflater _inflater; public MyAdapter(Context context, List<Food> objects) { super(context, 0, objects); _inflater = LayoutInflater.from(context); } @Override public View getView(int position, View convertView, ViewGroup parent) { if(convertView == null) { convertView = _inflater.inflate(R.layout.row, parent, false); } Food food = super.getItem(position); ((TextView)convertView.findViewById(R.id.text_name)).setText(food.name); ((TextView)convertView.findViewById(R.id.text_price)).setText(String.valueOf(food.price)); return convertView; } }
Food.java
public class Food { public String name; public int price; }
row.xml
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="horizontal" android:layout_width="match_parent" android:layout_height="match_parent"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/text_name" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/text_price" /> </LinearLayout>
MainActivity.java
public class MainActivity extends AppCompatActivity { private ListView view; private List<Food> foods; private MyAdapter adapter; private void setFoods() { Food food = new Food(); food.name = "Apple"; food.price = 120; foods.add(food); food = new Food(); food.name = "Orange"; food.price = 150; foods.add(food); } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); foods = new ArrayList<Food>(); adapter = new MyAdapter(this, foods); view = (ListView)findViewById(R.id.listview); view.setAdapter(adapter); setFoods(); } }