如何在android中实现listview上的弹出菜单

如何在android中实现listview上的弹出菜单,android,android-listview,popupmenu,Android,Android Listview,Popupmenu,我正在android中的listview上实现一个弹出菜单。我在这一行得到一个空指针异常 PopupMenu popupMenu = new PopupMenu(mContext,view.findViewById(R.id.imageButton1)); **只有第一行上的弹出菜单起作用。当我单击其他行中的按钮时,出现异常 原因是锚定视图为null,而不是上下文。如何解决这个问题 这是我完整的getView方法 @Override public View getView(int positi

我正在android中的listview上实现一个弹出菜单。我在这一行得到一个空指针异常

PopupMenu popupMenu = new PopupMenu(mContext,view.findViewById(R.id.imageButton1));
**只有第一行上的弹出菜单起作用。当我单击其他行中的按钮时,出现异常

原因是锚定视图为null,而不是上下文。如何解决这个问题

这是我完整的getView方法

@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();

        }
    });

由于要使用单击的按钮作为
pop菜单的主播视图
,因此可以使用
v
更改
视图。findViewById
,如:

 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();
        }
    });

由于要使用单击的按钮作为
pop菜单的主播视图
,因此可以使用
v
更改
视图。findViewById
,如:

 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();
        }
    });

无需在单击中手动查找DVIEWBYID imageButton1 v是imageButton1的参考:

PopupMenu popupMenu = new PopupMenu(mContext,v);

无需在单击中手动查找DVIEWBYID imageButton1 v是imageButton1的参考:

PopupMenu popupMenu = new PopupMenu(mContext,v);
在这里检查我的答案:在这里检查我的答案: