woshidan's loose leaf

ぼんやり勉強しています

ContextMenu周りのクラスについて

第5回分の演習をしていたら、ContextMenuの部分が難しかったので、じっくり読んでみます。

引用元ソース https://github.com/xinyis/android-training/blob/master/assignments/fundamentals/6th/ListViewAssignment/src/jp/mixi/assignment/listview/beg/MainActivity.java

public class MainActivity extends Activity {

    /* 略 */

    @Override
    protected void onResume() {
        super.onResume();
        // mListViewの登録は、onResume()にて行う
        // onResume()は一旦表示するActivityが切り替わる等してから
        // 再度表示されるタイミングで呼び出される
        registerForContextMenu(mListView);
    }

    // 入れ替え
    @Override
    protected void onPause() {
        super.onPause();
        // ContextMenuのイベントリスナ
        // はActivityが切り替わったら切っておかなきゃ行けない
        unregisterForContextMenu(mListView);
    }

    // 
    @Override
    public void onCreateContextMenu(ContextMenu menu, View view, ContextMenuInfo menuInfo) {
        super.onCreateContextMenu(menu, view, menuInfo);
        // ContextMenuを設定
        getMenuInflater().inflate(R.menu.context_menu_main, menu);
    }

    @Override
    public boolean onContextItemSelected(MenuItem item) {

        if (item.getItemId() != R.id.DeleteListItem && item.getItemId() != R.id.AddListItem) {
        // DeleteListItem, AddListItemはListView用のxmlにて定義
        // するものっぽい
            return false;
        }

        // MenuItemからContextMenuInfoを取得し、AdapterContextMenuInfoにキャストします
        ContextMenuInfo menuInfo = item.getMenuInfo();
        // ContextMenuInfoとは
        // http://developer.android.com/reference/android/view/ContextMenu.ContextMenuInfo.html
        // Context Menuの作成に関する追加情報を扱うクラス。たとえば、AdapterViewの場合が
        // ContextMenuを発生するViewに登録されていた場合、このクラスは、Adapterで扱っている
        // コレクションの中のどのアイテムを長押しする事でタップしているか、といった情報を持っている。
        // 具体的にクラスに対応する付属情報なんかはサブクラスを調べましょう、とのこと。

        AdapterContextMenuInfo adapterInfo = (AdapterContextMenuInfo) menuInfo;
        // http://developer.android.com/reference/android/widget/AdapterView.AdapterContextMenuInfo.html
        // 主な持っているプロパティ
        // position どの要素から表示されているか、indexを教えてくれる
        // targetView ContextMenuを表示するときにタップしていたListView中の1つの要素のView

        // AdapterContextMenuInfoから長押ししたリストアイテムのpositionを取得します
        int position = adapterInfo.position;

        // ListViewから長押しされたリストアイテムを取得します
        Book book = (Book) mListView.getItemAtPosition(position);
        // ListViewのぱっと見大事そうなAPI
        // http://developer.android.com/reference/android/widget/ListView.html
        // getAdapter() / setAdapter()
        // setSelection()
        // smoothScrollToPosition(int position)
        // addHeaderView()/addFooterView()

        // ListViewからセットされているAdapterを取得します
        // BookArrayAdapter adapter = (BookArrayAdapter) mListView.getAdapter();
        // ArrayAdapterのぱっと見大事そうなAPI
        // http://developer.android.com/reference/android/widget/ArrayAdapter.html
        // add(T object) Adapterに要素を追加
        // addAll(Collection<? extends T> collection) AdapterにCollection中の要素を追加
        // clear() Remove all elements from the list.
        // getContext() Returns the context associated with this array adapter.
        // getCount()
        // getFilter()
        // getPosition(T item) Returns the position of the specified item in the array.
        // insert(T object, int index) 
        // remove(T object)

        if (item.getItemId() == R.id.DeleteListItem) {
            // TODO:Adapterを使用して長押ししたデータを削除してください
            // 多分、今のpositionから今クリックしている要素を取得して、remove()
        } else if (item.getItemId() == R.id.AddListItem) {
            // TODO:Adapterを使用して長押ししたデータを追加してください
            // 多分、getCount()で最後の要素のindexを指定して、insertか
            // 単に要素をコピーしてadd()
        }
        // TODO:Adapterを使用して表示されているデータを更新してください
        // ListViewにAdapterをsetし直す?
        
        return true;
    }

}