我如何用ListPopupWindow替换我的popupmenu代码?

问题描述 投票:7回答:2

[目前,我正在以编程方式创建一个弹出菜单,其中显示楼层列表和标题。但是,仅更改标题的背景颜色并为标题添加关闭按钮真是一场噩梦。

我想用列表弹出窗口替换此弹出菜单,因此我可以为标题添加具有background属性的XML文件,其标题为黑色,菜单项的右侧和白色背景为关闭按钮。有没有一种方法可以通过列表弹出窗口来实现?这是我的代码:

private void floorMenu(ImageView btnFloorMenu){
    MapData data = new MapDao(MyPlugin.mapId);
    final List<Floor> flList = dao.getFloors();
    // set popupMenu
    final PopupMenu floorsPm = new PopupMenu(MapViewActivity.this,btnFloorMenu);

    MenuItem titleItem =  floorsPm.getMenu().add(Menu.NONE, Menu.NONE, Menu.NONE, "Floors");

    int i = 1;
    for(Floor fl : flList)
    {
        floorsPm.getMenu().add(Menu.NONE, i,i, fl.getName());
        if(i>3)
            break;
        i++;
    }


    // add popup listener
    floorsPm.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
        //    onClick
        @Override
        public boolean onMenuItemClick(MenuItem item){
            //       get floorname

            int flOrder = item.getOrder();
            if(flOrder == Menu.NONE )
                return true;
            flOrder--;

            final String floorId = flList.get(flOrder).getMapId();

            //       set camera to floor

            runOnUiThread(new Runnable() {
                @Override
                public void run() {
                    floorsPm.dismiss();
                    mapFragment.getMapManager().setCameraLayer(floorId, false);
                     Log.d(TAG, "post cameraLayer set");
                    changedSteps = true;
                    pauseNav();

                }
            });




            return true;
        }

    });
    floorsPm.show();


}
android popup popupwindow popupmenu android-popupwindow
2个回答
3
投票

这是我创建显示ListPopupWindow的示例

第一,为item_list_popup_window的每个项目创建布局[C0

ListPopupWindow

Second,<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="wrap_content" android:background="#e4e4e4" android:paddingTop="1dp" android:orientation="horizontal"> <TextView android:id="@+id/text_title" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_gravity="center" android:layout_weight="1" /> <Button android:id="@+id/button_delete" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Delete" /> </LinearLayout> 创建一个Adapter,例如

ListPopupWindow

第三,创建用于创建并显示public class ListPopupWindowAdapter extends BaseAdapter{ private Activity mActivity; private List<String> mDataSource = new ArrayList<>(); private LayoutInflater layoutInflater; private OnClickDeleteButtonListener clickDeleteButtonListener; ListPopupWindowAdapter(Activity activity, List<String> dataSource, @NonNull OnClickDeleteButtonListener clickDeleteButtonListener){ this.mActivity = activity; this.mDataSource = dataSource; layoutInflater = mActivity.getLayoutInflater(); this.clickDeleteButtonListener = clickDeleteButtonListener; } @Override public int getCount() { return mDataSource.size(); } @Override public String getItem(int position) { return mDataSource.get(position); } @Override public long getItemId(int position) { return 0; } @Override public View getView(final int position, View convertView, ViewGroup parent) { ViewHolder holder; if(convertView == null){ holder = new ViewHolder(); convertView = layoutInflater.inflate(R.layout.item_list_popup_window, null); holder.tvTitle = (TextView) convertView.findViewById(R.id.text_title); holder.btnDelete = (Button) convertView.findViewById(R.id.button_delete); convertView.setTag(holder); }else{ holder = (ViewHolder) convertView.getTag(); } // bind data holder.tvTitle.setText(getItem(position)); holder.btnDelete.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { clickDeleteButtonListener.onClickDeleteButton(position); } }); return convertView; } public class ViewHolder{ private TextView tvTitle; private Button btnDelete; } // interface to return callback to activity public interface OnClickDeleteButtonListener{ void onClickDeleteButton(int position); } }

的函数
ListPopupWindow

最后,您可以通过[]显示private void showListPopupWindow(View anchorView) { final ListPopupWindow listPopupWindow = new ListPopupWindow(this); listPopupWindow.setWidth(600); List<String> sampleData = new ArrayList<>(); sampleData.add("A"); sampleData.add("B"); sampleData.add("CCCCCCCCCCCCCC"); sampleData.add("D"); sampleData.add("EEEEEEEEE"); listPopupWindow.setAnchorView(anchorView); ListPopupWindowAdapter listPopupWindowAdapter = new ListPopupWindowAdapter(this, sampleData, new ListPopupWindowAdapter.OnClickDeleteButtonListener() { @Override public void onClickDeleteButton(int position) { Toast.makeText(MainActivity.this, "Click delete " + position, Toast.LENGTH_SHORT).show(); listPopupWindow.dismiss(); } }); listPopupWindow.setAdapter(listPopupWindowAdapter); listPopupWindow.show(); }

ListPopupWindow

例如,如果您想在单击按钮时显示它

showListPopupWindow(v);

anyButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { showListPopupWindow(v); } });

enter image description here


0
投票

请尝试此代码,也许您不会这样

© www.soinside.com 2019 - 2024. All rights reserved.