1 /* 2 * Copyright (C) 2013 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 package com.example.android.actionbarcompat.listpopupmenu; 17 18 import android.os.Bundle; 19 import android.support.v4.app.ListFragment; 20 import android.support.v7.widget.PopupMenu; 21 import android.view.MenuItem; 22 import android.view.View; 23 import android.view.ViewGroup; 24 import android.widget.ArrayAdapter; 25 import android.widget.ListView; 26 import android.widget.Toast; 27 28 import java.util.ArrayList; 29 30 /** 31 * This ListFragment displays a list of cheeses, with a clickable view on each item whichs displays 32 * a {@link android.support.v7.widget.PopupMenu PopupMenu} when clicked, allowing the user to 33 * remove the item from the list. 34 */ 35 public class PopupListFragment extends ListFragment implements View.OnClickListener { 36 37 @Override 38 public void onActivityCreated(Bundle savedInstanceState) { 39 super.onActivityCreated(savedInstanceState); 40 41 // We want to allow modifications to the list so copy the dummy data array into an ArrayList 42 ArrayList<String> items = new ArrayList<String>(); 43 for (int i = 0, z = Cheeses.CHEESES.length ; i < z ; i++) { 44 items.add(Cheeses.CHEESES[i]); 45 } 46 47 // Set the ListAdapter 48 setListAdapter(new PopupAdapter(items)); 49 } 50 51 @Override 52 public void onListItemClick(ListView listView, View v, int position, long id) { 53 String item = (String) listView.getItemAtPosition(position); 54 55 // Show a toast if the user clicks on an item 56 Toast.makeText(getActivity(), "Item Clicked: " + item, Toast.LENGTH_SHORT).show(); 57 } 58 59 @Override 60 public void onClick(final View view) { 61 // We need to post a Runnable to show the popup to make sure that the PopupMenu is 62 // correctly positioned. The reason being that the view may change position before the 63 // PopupMenu is shown. 64 view.post(new Runnable() { 65 @Override 66 public void run() { 67 showPopupMenu(view); 68 } 69 }); 70 } 71 72 // BEGIN_INCLUDE(show_popup) 73 private void showPopupMenu(View view) { 74 final PopupAdapter adapter = (PopupAdapter) getListAdapter(); 75 76 // Retrieve the clicked item from view's tag 77 final String item = (String) view.getTag(); 78 79 // Create a PopupMenu, giving it the clicked view for an anchor 80 PopupMenu popup = new PopupMenu(getActivity(), view); 81 82 // Inflate our menu resource into the PopupMenu's Menu 83 popup.getMenuInflater().inflate(R.menu.popup, popup.getMenu()); 84 85 // Set a listener so we are notified if a menu item is clicked 86 popup.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() { 87 @Override 88 public boolean onMenuItemClick(MenuItem menuItem) { 89 switch (menuItem.getItemId()) { 90 case R.id.menu_remove: 91 // Remove the item from the adapter 92 adapter.remove(item); 93 return true; 94 } 95 return false; 96 } 97 }); 98 99 // Finally show the PopupMenu 100 popup.show(); 101 } 102 // END_INCLUDE(show_popup) 103 104 /** 105 * A simple array adapter that creates a list of cheeses. 106 */ 107 class PopupAdapter extends ArrayAdapter<String> { 108 109 PopupAdapter(ArrayList<String> items) { 110 super(getActivity(), R.layout.list_item, android.R.id.text1, items); 111 } 112 113 @Override 114 public View getView(int position, View convertView, ViewGroup container) { 115 // Let ArrayAdapter inflate the layout and set the text 116 View view = super.getView(position, convertView, container); 117 118 // BEGIN_INCLUDE(button_popup) 119 // Retrieve the popup button from the inflated view 120 View popupButton = view.findViewById(R.id.button_popup); 121 122 // Set the item as the button's tag so it can be retrieved later 123 popupButton.setTag(getItem(position)); 124 125 // Set the fragment instance as the OnClickListener 126 popupButton.setOnClickListener(PopupListFragment.this); 127 // END_INCLUDE(button_popup) 128 129 // Finally return the view to be displayed 130 return view; 131 } 132 } 133 134 } 135