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
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
}
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
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);
128
129
// Finally return the view to be displayed
130
return view;
131
}
132
}
133
134
}