アンドロイドのあれこれ
[PR]
×
[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。
ListViewを使いこなそうね
使いこなそうねと言っても基本だけ書きます。ごめんなさい(´・ω・`)
- <ListView> リソースの設定
android:divider="#CCCCCC" リスト区切り線の色
android:dividerHeight="1sp" リスト区切り線の高さ
android:fadingEdge リスト上下フェードを表示・非表示設定
android:fadingEdgeLength フェードの高さ
フェードの色は android:cacheColorHint で設定できます。
android:fastScrollEnabled スクロールバーのつまみを表示・非表示設定
android:scrollingCache スクロールするときのキャッシュを使用するかどうか。スクロールするときにリストがフェードの色になったり、背景の色になってしまったりする場合はfalseにしておく
- <ListView> リソースの設定
android:divider="#CCCCCC" リスト区切り線の色
android:dividerHeight="1sp" リスト区切り線の高さ
android:fadingEdge リスト上下フェードを表示・非表示設定
android:fadingEdgeLength フェードの高さ
フェードの色は android:cacheColorHint で設定できます。
android:fastScrollEnabled スクロールバーのつまみを表示・非表示設定
android:scrollingCache スクロールするときのキャッシュを使用するかどうか。スクロールするときにリストがフェードの色になったり、背景の色になってしまったりする場合はfalseにしておく
- ListViewを実装してみる
Theme.Light.NoTitleBarの場合
- 独自のリストアダプターを作ってリストビューをカスタマイズする。
リストアイテム(行)のビューを作る。
- ListViewのアクション
リストのアイテムがタップされたときのイベント設定
MyListViewのアクティビティにonListItemClickを追加
- リストアイテムを選択したらダイアログメニューを表示
ユーザーインターフェース的にリストアイテムを「タップ」と「ログタップ(長押し)」があって
アプリによって動作を分けるのをよく見かけますが、ふと思ったのは
一般ユーザーは長押しを知らないのです。つまり、ここアイテムを長押しするとメニューが見えるよ!ってなかなか気づいてくれないものなんです。
なのでより優しいインターフェースのために最初からタップで次のアクションを設定しましょう。
ついでにダイアログメニューの「Delete」を押したらアイテムを消す。リアルタイムにリスト変更してみる
以上です。
<!-- res/layout/mylist.xml --> <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" > <include layout="@layout/title_layout" /> <ListView android:id="@+id/android:list" android:layout_width="fill_parent" android:layout_height="fill_parent" android:scrollingCache="false" android:divider="#CCCCCC" android:dividerHeight="1sp" android:fadingEdge="none" /> </LinearLayout>
// MyListView.java public class MyListView extends ListActivity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.mylist); //アダプター作成してリストアイテムを追加 ArrayAdapter<String> adapter = new ArrayAdapter(this, android.R.layout.simple_list_item_1); adapter.add("1111"); adapter.add("2222"); adapter.add("3333"); adapter.add("4444"); adapter.add("5555"); //アダプターを設定 setListAdapter(adapter); } }Theme.Black.NoTitleBarで設定している場合
Theme.Light.NoTitleBarの場合
- 独自のリストアダプターを作ってリストビューをカスタマイズする。
リストアイテム(行)のビューを作る。
<!-- res/layout/list_row.xml --> <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" android:padding="10dip" > <TextView android:id="@+id/title" android:layout_width="fill_parent" android:layout_height="wrap_content" android:textSize="16sp" android:textStyle="bold" android:text="Title" /> <TextView android:id="@+id/desc" android:layout_width="fill_parent" android:layout_height="wrap_content" android:textSize="13sp" android:text="Description" /> </LinearLayout>アダプターを作る
// MyListViewAdapter.java public class MyListViewAdapter extends ArrayAdapter<HashMap<String, String>>{ private LayoutInflater mInflater; private TextView mTitle; private TextView mDesc; public MyListViewAdapter(Context context, List<HashMap<String, String>> objects) { super(context, 0, objects); mInflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); } @Override public View getView(int position, View convertView, ViewGroup parent) { if (convertView == null) { convertView = mInflater.inflate(R.layout.list_row, null); } HashMap<String, String> item = this.getItem(position); if (item != null) { mTitle = (TextView)convertView.findViewById(R.id.title); mTitle.setText(item.get("title")); mDesc = (TextView)convertView.findViewById(R.id.desc); mDesc.setText(item.get("desc")); } return convertView; } }ListActivityを作る
// MyListView.java public class MyListView extends ListActivity { ArrayList<HashMap<String, String>> mList; MyListViewAdapter adapter; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.mylist); mList = new ArrayList<HashMap<String, String>>(); HashMap<String, String> item; for (int a = 0; a < 10; a++) { item = new HashMap<String, String>(); item.put("title", "Title " + String.valueOf(a+1)); item.put("desc", "Description " + String.valueOf(a+1)); mList.add(item); } //アダプター作成してリストアイテムを追加 adapter = new MyListViewAdapter(this, mList); //アダプターを設定 setListAdapter(adapter); } }
- ListViewのアクション
リストのアイテムがタップされたときのイベント設定
MyListViewのアクティビティにonListItemClickを追加
// MyListView.java @Override protected void onListItemClick(ListView l, View v, int position, long id) { super.onListItemClick(l, v, position, id); //do something here.... }onListItemClickの中でどのアイテムがタップされたかを判断するためにはpositionから取得できます。
// MyListView.java @Override protected void onListItemClick(ListView l, View v, int position, long id) { super.onListItemClick(l, v, position, id); HashMap<String, String> item = mList.get(position); Intent i = new Intent(this, SubActivity.class); i.putExtra("item", item); startActivity(i); }
- リストアイテムを選択したらダイアログメニューを表示
ユーザーインターフェース的にリストアイテムを「タップ」と「ログタップ(長押し)」があって
アプリによって動作を分けるのをよく見かけますが、ふと思ったのは
一般ユーザーは長押しを知らないのです。つまり、ここアイテムを長押しするとメニューが見えるよ!ってなかなか気づいてくれないものなんです。
なのでより優しいインターフェースのために最初からタップで次のアクションを設定しましょう。
// MyListView.java @Override protected void onListItemClick(ListView l, View v, int position, long id) { super.onListItemClick(l, v, position, id); HashMap<String, String> item = mList.get(position); String[] dialogItem = new String[]{"Open", "Save", "Delete"}; AlertDialog.Builder dialogMenu = new AlertDialog.Builder(this); dialogMenu.setTitle(item.get("title")); dialogMenu.setItems(dialogItem, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { } }).create().show(); }
ついでにダイアログメニューの「Delete」を押したらアイテムを消す。リアルタイムにリスト変更してみる
// MyListView.java @Override protected void onListItemClick(ListView l, View v, int position, long id) { super.onListItemClick(l, v, position, id); final HashMap<String, String> item = mList.get(position); String[] dialogItem = new String[]{"Open", "Save", "Delete"}; AlertDialog.Builder dialogMenu = new AlertDialog.Builder(this); dialogMenu.setTitle(item.get("title")); dialogMenu.setItems(dialogItem, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { switch (which) { case 2: adapter.remove(item); adapter.notifyDataSetChanged(); break; } } }).create().show(); }adapter.addまたはadapter.removeなど使ったら反映させたければadapter.notifyDataSetChanged()の実行を忘れずに
以上です。
COMMENT