Popup Menu in custom ListView

前端 未结 7 1355
礼貌的吻别
礼貌的吻别 2020-12-05 11:44

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 appl

相关标签:
7条回答
  • 2020-12-05 12:22

    I finally found the solution to my problem, eventhough I have no explanation why this solution works.

    With the following import I always had the error:

    import android.support.v7.widget.PopupMenu;
    

    It works fine with the following import:

    import android.widget.PopupMenu;
    

    I tested the code provided by Ric (Thanks for the great help!) and my own. Both are working now. Maybe someone has an explanation why the import matters in this case.

    0 讨论(0)
  • 2020-12-05 12:22
        popup = (Button)findViewById(R.id.button);
    
        popup.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                PopupMenu popup = new PopupMenu(MainActivity.this,view);
                popup.getMenuInflater().inflate(R.menu.popup_menu,popup.getMenu());
                popup.show();
                popup.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
                    @Override
                    public boolean onMenuItemClick(MenuItem item) {
                        int id = item.getItemId();
                        if(id==R.id.install){
                            show_toast("Install Clicked");
                        }else{
                            show_toast("WishList Clicked");                            
                        }
                        return true;
                    }
                });
            }
        });
    
    
    
        public void show_toast(String message){
            Toast.makeText(this,message,Toast.LENGTH_SHORT).show();
        }
    

    Note:
    Don't forgot to import this....

    import android.support.v7.widget.PopupMenu;
    import android.view.MenuItem;
    
    0 讨论(0)
  • 2020-12-05 12:22

    I've just had the same issue when I modified the theme parent style: from

    <style name="MainAppTheme" parent="@style/Theme.AppCompat.Light">
    

    to

    <style name="MainAppTheme" parent="@style/Theme.Base.AppCompat.Light">
    

    Maybe your app uses the Theme.Base style, which does not define the required 6th parameter used by PopupMenu. From SO question How to use ActionBarActivity with Theme.Material, Theme.AppCompat extends Theme.Base.AppCompat

    0 讨论(0)
  • 2020-12-05 12:24

    First create a button in your custom-item-listview.xml and then add the code below:

    Button:

    <Button
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="@string/button_text"
    android:id="@+id/button1"
    ... />
    

    class:

    public class CustomAdapter extends ArrayAdapter<CustomItem> {
    
        private static Activity context = null;
        private final ArrayList<CustomItem> mItemsArrayList;
        private CustomFragment mFragment;
    
    
        public CustomAdapter(Activity context, ArrayList<CustomItem> 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<YourArrayAdapter> {
    
    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;
    
    }
    
    0 讨论(0)
  • 2020-12-05 12:27

    use this as(activity context)not application context or context

         PopupMenu popup = new PopupMenu(this, v);
    
    0 讨论(0)
  • 2020-12-05 12:27

    Rick's code of lines works perfect as long as you import the following:

    import android.widget.PopupMenu;
    

    Not the one below:

    import android.support.v7.widget.PopupMenu;
    
    0 讨论(0)
提交回复
热议问题