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();
}
});
SInce you want to use the button you clicked on, as anchorView for your
PopMenu
, you can changeview.findViewById
withv
, like: