我想通过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
答案 0 :(得分:0)
还需要为ListPopupWindow
提供高度参数:
mPopupWindow.setHeight(400);
或使用ListPopupWindow.WRAP_CONTENT
而不是400来设置弹出窗口的高度。