Blog coding and discussion of coding about JavaScript, PHP, CGI, general web building etc.

Tuesday, June 21, 2016

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.

Screenshot of Google Play items

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