как создать всплывающее меню в Android CardView

Я хочу создать всплывающее меню с параметрами редактирования и удаления в представлении карты. Я пробовал приведенный ниже код, но я принудительно закрываюсь в popup.show();с фатальным исключением onclick из imageview. Что мне сделать, чтобы создать всплывающее меню на cardview?

public class ShipRecyclerAdapter extends RecyclerView.Adapter<ShipRecyclerAdapter.ViewHolder> {

public static final String PRODUCTID = "PRODUCTID";
public static final String PRODUCTNAME = "PRODUCTNAME";

List<CustDatabaseModel> dbCustList;
static Context context;
public ImageView btndots;

ShipRecyclerAdapter(Context context, List<CustDatabaseModel> dbCustList ){
    this.dbCustList = new ArrayList<CustDatabaseModel>();
    this.context = context;
    this.dbCustList = dbCustList;

}

@Override
public ShipRecyclerAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {

    View itemLayoutView = LayoutInflater.from(parent.getContext()).inflate(
            R.layout.address_list, null);

    // create ViewHolder

    ViewHolder viewHolder = new ViewHolder(itemLayoutView);
    return viewHolder;
}

@Override
public void onBindViewHolder(ShipRecyclerAdapter.ViewHolder holder, final int position) {

    holder.address.setText(dbCustList.get(position).getaddress());
    holder.city.setText(dbCustList.get(position).getcity());
    holder.state.setText(dbCustList.get(position).getstate());
    holder.zipcode.setText(dbCustList.get(position).getzip());

  final String adr=dbCustList.get(position).getaddress().toString();

    holder.btndots.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(final View v) {
            PopupMenu popup = new PopupMenu(context, btndots);
            //Inflating the Popup using xml file
            popup.getMenuInflater().inflate(R.menu.popup_menu, popup.getMenu());

            popup.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
                public boolean onMenuItemClick(MenuItem item) {
                    Intent i;
                    if ((item.getTitle().toString()).equalsIgnoreCase("Edit")) {
                        Toast.makeText(ShipRecyclerAdapter.context, "you have clicked Menu image ", Toast.LENGTH_LONG).show();

                    } else if ((item.getTitle().toString()).equalsIgnoreCase("Delete")) {
                        Toast.makeText(ShipRecyclerAdapter.context, "you have clicked Menu image ", Toast.LENGTH_LONG).show();
                    }
                    return true;
                }
            });

            popup.show();
        }
    });



    //closing the setOnClickListener method



}

@Override
public int getItemCount() {
    return dbCustList.size();
}

public class ViewHolder extends RecyclerView.ViewHolder {

    public TextView state,address,city,zipcode;
    public ImageView btndots;



    public ViewHolder(View itemLayoutView) {
        super(itemLayoutView);
        address = (TextView) itemLayoutView.findViewById(R.id.textViewAddress);
        city = (TextView)itemLayoutView.findViewById(R.id.textViewCity);
        zipcode = (TextView)itemLayoutView.findViewById(R.id.textViewZipcode);
        state = (TextView)itemLayoutView.findViewById(R.id.textViewState);
        this.btndots = (ImageView)itemLayoutView.findViewById(R.id.cmenu);


    }



}

}`


person ashwini shahasane    schedule 01.03.2016    source источник
comment
Ваш вопрос не ясен, вы говорите о всплывающем меню и показываете код для адаптера. Где код всплывающего меню?   -  person Himanshu Shekher Jha    schedule 01.03.2016
comment
см. эту документацию по стеку: stackoverflow.com/documentation/android/169 /recyclerview/14542/   -  person Sagar Chavada    schedule 03.11.2016


Ответы (2)


сначала создайте xml-файл в папке меню, как это,

 <?xml version="1.0" encoding="utf-8"?>
 <menu xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto">

    <item
        android:id="@+id/edit"
        android:title="@string/edit"
        app:showAsAction="ifRoom" />

    <item
        android:id="@+id/delete"
        android:title="@string/delete"
        app:showAsAction="ifRoom" />

</menu>

затем создайте метод в своем классе адаптера,

private void showPopup(View view, final int position) {
    // pass the imageview id
    View menuItemView = view.findViewById(R.id.btn_song_list_more);
    PopupMenu popup = new PopupMenu(activity, menuItemView);
    MenuInflater inflate = popup.getMenuInflater();
    inflate.inflate(R.menu.popup_menu, popup.getMenu());
    Log.e("position -- " + position);

    popup.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {

        @Override
        public boolean onMenuItemClick(MenuItem item) {
            switch (item.getItemId()) {
                case R.id.edit:
                  // do what you need.
                    break;
                case R.id.delete:
          // do what you need .
                    break;
                default:
                    return false;
            }
            return false;
        }
    });
    popup.show();
}

вызовите этот метод вашего события click imageview.

person Dharmik Mavani    schedule 01.03.2016

Попробуй это

в Oncreate вашей деятельности вы сначала регистрируетесь в контекстном меню для recyclerView, используя

registerForContextMenu(recyclerView); 

и создайте контекстное меню, например

@Override
    public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo)
    {
        super.onCreateContextMenu(menu, v, menuInfo);
        menu.setHeaderTitle("Select The Action");
        menu.add(0, v.getId(), 0, "Call");//groupId, itemId, order, title
        menu.add(0, v.getId(), 0, "SMS");
    }
    @Override
    public boolean onContextItemSelected(MenuItem item){
        if(item.getTitle()=="Call"){
            Toast.makeText(getApplicationContext(), "calling code", Toast.LENGTH_LONG).show();
        }
        else if(item.getTitle()=="SMS"){
            Toast.makeText(getApplicationContext(),"sending sms code",Toast.LENGTH_LONG).show();
        }else{
            return false;
        }
        return true;
    }

Надеюсь, это поможет вам

person saeed    schedule 01.03.2016
comment
получение ошибки «не удается разрешить метод» в super.onCreateContextMenu(menu, v, menuInfo); - person ashwini shahasane; 01.03.2016