ListPopupWindow.createDragToOpenListener()不起作用

时间:2014-02-18 11:56:26

标签: android android-listview android-arrayadapter popupmenu

我想通过ArrayAdapter显示的列表项中的ImageButton显示上下文菜单。

我创建了ListPopupWindow对象并为其设置了ArrayAdapter。然后,我将setOnTouchListener设置为holder.menu我是通过从ListPopupWindowCompat获取onTouchListener来实现的,以保持兼容性。

但是,当我触摸holder.menu时,它什么都不做

public class MyAdapter extends ArrayAdapter<MyObject>{

    private final ActivityMain mActivity;
    private final List<MyObject> mMyObjectList;
    private final ListPopupWindow mPopupWindow;

    private final ImageFetcher mImageFetcher;

    public AdapterWebcam(ActivityMain activity, List<MyObject> myObjectList, ImageFetcher imageFetcher){
        super(activity, R.layout.listitem_webcam, webcamList);
        this.mActivity = activity;
        this.mMyObjectList = myObjectList;
        this.mImageFetcher = imageFetcher;
        this.mPopupWindow = new ListPopupWindow(mActivity);
        mPopupWindow.setWidth(600);
        mPopupWindow.setAdapter(new ArrayAdapter<String>(mActivity, android.R.layout.simple_list_item_1,
                new String[]{"One", "two", "three"}));

    }

    public View getView(int position, View convertView, ViewGroup parent){
        View item = convertView;
        ViewHolder holder;
        String url = mMyObjectList.get(position).getUrl();


        if(item == null){
            LayoutInflater inflater = mActivity.getLayoutInflater();
            item = inflater.inflate(R.layout.listitem_object, null);
            holder = new ViewHolder();
            holder.text = (TextView) item.findViewById(R.id.listitem_object_title);
            holder.image = (ImageView) item.findViewById(R.id.listitem_object_imageview);
            holder.menu = (ImageButton) item.findViewById(R.id.listitem_object_menubutton);

            item.setTag(holder);
        }else{
            holder = (ViewHolder) item.getTag();
        }

        holder.text.setText(mMyObjectList.get(position).getName());
        mImageFetcher.loadImage(url, holder.image);
        holder.menu.setOnTouchListener(ListPopupWindowCompat.createDragToOpenListener(mPopupWindow, holder.menu));

        return item;
    }

    static class ViewHolder{
        TextView text;
        ImageView image;
        ImageButton menu;
    }


}

此外,我试图通过通常的方式做到这一点:

holder.menu.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View view, MotionEvent motionEvent) {
                mPopupWindow.show();
                return false;
            }
        });

但我有以下堆栈跟踪:

02-18 12:54:41.846  11977-11977/? E/AndroidRuntime﹕ FATAL EXCEPTION: main
    Process: com.iamaner.skiwebcam, PID: 11977
    java.lang.NullPointerException
            at android.widget.PopupWindow.getMaxAvailableHeight(PopupWindow.java:1271)
            at android.widget.ListPopupWindow.buildDropDown(ListPopupWindow.java:1142)
            at android.widget.ListPopupWindow.show(ListPopupWindow.java:554)
            at com.iamaner.skiwebcam.AdapterWebcam$1.onTouch(AdapterWebcam.java:64)
            at android.view.View.dispatchTouchEvent(View.java:7708)
            at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2216)
            at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1917)
            at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2216)
            at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1917)
            at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2216)
            at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1917)
            at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2216)
            at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1917)
            at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2216)
            at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1917)
            at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2216)
            at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1917)
            at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2216)
            at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1917)
            at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2216)
            at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1917)
            at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2216)
            at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1917)
            at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2216)
            at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1917)
            at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2216)
            at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1917)
            at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2216)
            at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1917)
            at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:2068)
            at com.android.internal.policy.impl.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1515)
            at android.app.Activity.dispatchTouchEvent(Activity.java:2468)
            at android.support.v7.app.ActionBarActivityDelegateICS$WindowCallbackWrapper.dispatchTouchEvent(ActionBarActivityDelegateICS.java:260)
            at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:2016)
            at android.view.View.dispatchPointerEvent(View.java:7893)
            at android.view.ViewRootImpl$ViewPostImeInputStage.processPointerEvent(ViewRootImpl.java:3954)
            at android.view.ViewRootImpl$ViewPostImeInputStage.onProcess(ViewRootImpl.java:3833)
            at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3399)
            at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:3449)
            at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:3418)
            at android.view.ViewRootImpl$AsyncInputStage.forward(ViewRootImpl.java:3525)
            at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:3426)
            at android.view.ViewRootImpl$AsyncInputStage.apply(ViewRootImpl.java:3582)
            at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3399)
            at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:3449)
            at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:3418)
            at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:3426)
            at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3399)
            at android.view.ViewRootImpl.deliverInputEvent(ViewRootImpl.java:5602)
            at android.view.ViewRootImpl.doProcessInputEvents(ViewRootImpl.java:5582)
            at android.view.ViewRootImpl.enqueueInputEvent(ViewRootImpl.java:5553)
            at android.view.ViewRootImpl$WindowInputEventReceiver.onInputEvent(ViewRootImpl.java:568

1 个答案:

答案 0 :(得分:0)

还需要为ListPopupWindow提供高度参数:

mPopupWindow.setHeight(400);

或使用ListPopupWindow.WRAP_CONTENT而不是400来设置弹出窗口的高度。