How to implement popup menu on a listview in android

1.8k Views Asked by At

I am implementing a pop up menu on listview in android. I am getting a null pointer exception, on this line

PopupMenu popupMenu = new PopupMenu(mContext,view.findViewById(R.id.imageButton1));

**Only the pop up menu on the first row is working. When I clicked the button in the other rows the exception comes.

The reason is the anchor view is null, not the context. How to fix this issue?

Here is my complete getView method.

@Override
public View getView(int position,View convertView, ViewGroup parent) {

    ViewHolderItem viewHolder = null;

    final View view = convertView;

    if (convertView == null) {

        if (inflater == null) {
            inflater = (LayoutInflater) mContext
                    .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        }
        convertView = inflater.inflate(R.layout.main_list_row, null);

        viewHolder = new ViewHolderItem();

        viewHolder.tvTitle = (TextViewPlus) convertView
                .findViewById(R.id.tvShowTitle);
        viewHolder.tvChannelName = (TextViewPlus) convertView
                .findViewById(R.id.tvChannelName);
        viewHolder.tvViews = (TextViewPlus) convertView
                .findViewById(R.id.tvViews);
        viewHolder.ivThumbImage = (ImageView) convertView
                .findViewById(R.id.ivThumbImage);
        viewHolder.tvShowId = (TextView) convertView
                .findViewById(R.id.tvShowId);
        viewHolder.btnSubscribe = (Button)convertView.findViewById(R.id.btnSubscribe);
        //viewHolder.imgButton = (ImageButton)convertView.findViewById(R.id.imageButton1);
        viewHolder.btnTest = (Button)convertView.findViewById(R.id.imageButton1);

        convertView.setTag(viewHolder);

    } else {

        viewHolder = (ViewHolderItem) convertView.getTag();
    }

    SharedPreferences SP = PreferenceManager
            .getDefaultSharedPreferences(mContext);
    String languageType = SP.getString("applicationLanguage", "2");

    final Show show = data.get(position);

    if (languageType.equals("2")) {
        viewHolder.tvTitle.setText(show.getShowNameEn());
        viewHolder.tvChannelName.setText(show.getChannelNameEn());
    } else {
        viewHolder.tvTitle.setText(show.getShowNameSi());
        viewHolder.tvChannelName.setText(show.getChannelNameSi());
    }

    viewHolder.tvViews.setText("Views :" + show.getViews());
    viewHolder.tvShowId.setText(show.getShowId());
    viewHolder.btnSubscribe.setTag(position);
    viewHolder.btnTest.setTag(position);

    if(show.getSubscribed()==0){
        viewHolder.btnSubscribe.setText("Subscribe");
    }else{
        viewHolder.btnSubscribe.setText("Unsubscribe");
    }

    viewHolder.btnSubscribe.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {

            int result = dbHelper.subscribeShow(Integer.parseInt(show.getShowId()));

            if(result>0){

                if(((Button)v).getText().equals("Subscribe")){
                    ((Button)v).setText("Unsubscribe");
                }else if(((Button)v).getText().equals("Unsubscribe")){
                    ((Button)v).setText("Subscribe");
                }
            }

            data = dbHelper.getShowList(Integer.parseInt(show.getCategoryId()));

        }
    });

    viewHolder.btnTest.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {

            PopupMenu popupMenu = new PopupMenu(mContext,view.findViewById(R.id.imageButton1));

            popupMenu.inflate(R.menu.list_menu);

            popupMenu.show();

        }
    });
2

There are 2 best solutions below

0
On BEST ANSWER

SInce you want to use the button you clicked on, as anchorView for your PopMenu, you can change view.findViewById with v, like:

 viewHolder.btnTest.setOnClickListener(new View.OnClickListener() {    
        @Override
        public void onClick(View v) {  
            PopupMenu popupMenu = new PopupMenu(mContext,v);
            popupMenu.inflate(R.menu.list_menu);
            popupMenu.show();
        }
    });
0
On

No need to manually findViewById imageButton1 in on click v is reference of imageButton1 :

PopupMenu popupMenu = new PopupMenu(mContext,v);