package com.yokmama.learn10.chapter06.lesson28; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.os.Bundle; import android.support.annotation.Nullable; import android.support.v4.app.Fragment; import android.support.v4.content.LocalBroadcastManager; import android.view.ContextMenu; import android.view.LayoutInflater; import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; import android.widget.AdapterView; import android.widget.ListView; import java.util.List; public class TodoListFragment extends Fragment implements AdapterView.OnItemClickListener { public static final String TAG = TodoListFragment.class.getSimpleName(); public static final String ACTION_CREATE_TODO = "action-create_todo"; private static final int MENU_ID_DELETE = 1; private TodoListAdapter mAdapter; private List<Todo> mTodoList; public static TodoListFragment newInstance() { return new TodoListFragment(); } @Nullable @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View rootView = inflater.inflate(R.layout.fragment_list, container, false); //ダミーデータを作成してAdapterにセット mTodoList = ((MainActivity) getActivity()).getTodoList(); mAdapter = new TodoListAdapter(getActivity(), mTodoList); //ListViewを初期化 ListView listView = (ListView) rootView.findViewById(R.id.todo_list); listView.setOnItemClickListener(this); listView.setAdapter(mAdapter); //ListViewにコンテキストメニューを設定 registerForContextMenu(listView); //新規作成Buttonの設定 rootView.findViewById(R.id.create_todo).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { //TODOリストを追加 ((MainActivity) getActivity()).showTodoForm(null); } }); //BroadcastReceiverを登録 LocalBroadcastManager.getInstance(getActivity()).registerReceiver( mAddTodoReceiver, new IntentFilter(ACTION_CREATE_TODO)); return rootView; } @Override public void onDestroy() { //BroadcastReceiverを解除 LocalBroadcastManager.getInstance(getActivity()).unregisterReceiver(mAddTodoReceiver); super.onDestroy(); } @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { //クリックしたアイテムを表示 ((MainActivity) getActivity()).showTodoForm(mAdapter.getItem(position)); } @Override public void onCreateContextMenu(ContextMenu menu, View view, ContextMenu.ContextMenuInfo menuInfo) { super.onCreateContextMenu(menu, view, menuInfo); //ListViewのコンテキストメニューを作成 //TODO:レッスンではここにプログラムを追加 } //コンテキストメニュークリック時のリスナー @Override public boolean onContextItemSelected(MenuItem item) { AdapterView.AdapterContextMenuInfo info = (AdapterView.AdapterContextMenuInfo) item .getMenuInfo(); int itemId = item.getItemId(); if (itemId == MENU_ID_DELETE) { //アイテムを削除 //TODO:レッスンではここにプログラムを追加 return true; } return super.onContextItemSelected(item); } /** * Todoリストの作成・変更を検知するBroadcastReceiver. */ BroadcastReceiver mAddTodoReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { //Todoデータを作成 int color = intent.getIntExtra(TodoFormFragment.ARGS_COLORLABEL, Todo.ColorLabel.NONE); String value = intent.getStringExtra(TodoFormFragment.ARGS_VALUE); long createdTime = intent.getLongExtra(TodoFormFragment.ARGS_CREATEDTIME, 0); Todo newItem = new Todo(color, value, createdTime); //作成時間を既に存在するデータか確認 int updateIndex = -1; for (int i = 0; i < mAdapter.getCount(); i++) { Todo item = mAdapter.getItem(i); if (item.getCreatedTime() == newItem.getCreatedTime()) { updateIndex = i; } } if (updateIndex == -1) { //既存データがなければ新規Todoとして追加 mTodoList.add(newItem); } else { //既存データがあれば上書き mTodoList.remove(updateIndex); mTodoList.add(updateIndex, newItem); } //TODOリストを更新 mAdapter.notifyDataSetChanged(); } }; }