Popup Menu in custom ListView
Popup Menu in custom ListView
Dear Stackoverflow community!
I need help with a problem I could not find any solution for by now.
What I want to achieve:
I have a custom ListView adapter. To each Listitem I want to add a popup menu, pretty similar to the ListView in the current Google Play application.
This is what I tried: Most of my code comes from this Android sample samples\android-19\ui\ActionBarCompat-ListPopupMenu
CustomFragmentPageAdapter.java:
// create new fragment mCustomFragment = CustomFragment.newInstance(position); CustomFragment.java
public class CustomFragment extends ListFragment implements View.OnClickListener{ ... @Override public void onClick(final View v) { v.post(new Runnable() { @Override public void run() { showPopupMenu(v); } }); } private void showPopupMenu(View view) { PopupMenu popup = new PopupMenu(getActivity(), view); popup.getMenuInflater().inflate(R.menu.popup_menu, popup.getMenu()); popup.show(); } CustomArrayAdapter:
public class CustomAdapter extends ArrayAdapter { ... @Override public View getView(int position, View convertView, ViewGroup parent) { final int pos = position; LayoutInflater inflater = (LayoutInflater) context .getSystemService(Context.LAYOUT_INFLATER_SERVICE); final View rowView = inflater.inflate(R.layout.watch_list_row, parent, false); View popupButton = rowView.findViewById(R.id.imgPopUp); popupButton.setTag(getItem(position)); popupButton.setOnClickListener(mFragment); return rowView; } } popup_menu.xml:
Logcat output:
java.lang.RuntimeException: Failed to resolve attribute at index 6 at android.content.res.TypedArray.getLayoutDimension(TypedArray.java:603) at android.view.ViewGroup$LayoutParams.setBaseAttributes(ViewGroup.java:6423) at android.view.ViewGroup$MarginLayoutParams.(ViewGroup.java:6591) at android.widget.FrameLayout$LayoutParams.(FrameLayout.java:735) ... The error is thrown at popup.show() in my CustomFragment.
This error is clearly driving me crazy and ANY help to solve this issue is highly appreciated!
Answer by Rick for Popup Menu in custom ListView
First create a button in your custom-item-listview.xml and then add the code below:
Button:
class:
public class CustomAdapter extends ArrayAdapter { private static Activity context = null; private final ArrayList mItemsArrayList; private CustomFragment mFragment; public CustomAdapter(Activity context, ArrayList itemsArrayList, CustomFragment fragment) { super(context, R.layout.watch_list_row, itemsArrayList); CustomAdapter.context = context; this.mItemsArrayList = itemsArrayList; this.mFragment = fragment; } @Override public View getView(int position, View convertView, ViewGroup parent) { final int pos = position; LayoutInflater inflater = (LayoutInflater) context .getSystemService(Context.LAYOUT_INFLATER_SERVICE); final View rowView = inflater.inflate(R.layout.watch_list_row, parent, false); final Button popUp_btn = (Button)rowView.findViewById(R.id.button1); popUp_btn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { final PopupMenu popup = new PopupMenu(context, popUp_btn); popup.getMenuInflater().inflate(R.menu.context_menu, popup.getMenu()); popup.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() { public boolean onMenuItemClick(MenuItem item) { int i = item.getItemId(); if (i == R.id.item1) { //do something return true; } else if (i == R.id.item2){ //do something return true; } else if (i == R.id.item3) { //do something return true; } else { return onMenuItemClick(item); } } }); popup.show(); EDIT: This works well for me:
TAB1
public class TAB1 extends Fragment { View view; public TAB1() { } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { view = inflater.inflate(R.layout.tab1, null); ListView list = (ListView) view.findViewById(android.R.id.list); CustomList adapter = new CustomList(getActivity()); adapter.addAll(); list.setAdapter(adapter); return view; } CustomList:
public class CustomList extends ArrayAdapter { private static Activity context = null; public CustomList(Activity context) { super(context, R.layout.custom_listview, web); CustomList.context = context; } @Override public View getView(final int position, View view, ViewGroup parent) { LayoutInflater inflater = context.getLayoutInflater(); final View rowView = inflater.inflate(R.layout.custom_listview, null, true); //your stuff here final Button popUp_btn = (Button)rowView.findViewById(R.id.button1); popUp_btn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { final PopupMenu popup = new PopupMenu(context, popUp_btn); popup.getMenuInflater().inflate(R.menu.context_menu, popup.getMenu()); popup.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() { public boolean onMenuItemClick(MenuItem item) { int i = item.getItemId(); if (i == R.id.item1) { //do something return true; } else if (i == R.id.item2){ //do something return true; } else if (i == R.id.item3) { //do something return true; } else { return onMenuItemClick(item); } } }); popup.show(); } }); return rowView; } Answer by Philippe for Popup Menu in custom ListView
I've just had the same issue when I modified the theme parent style: from
