我有一个使用自定义网格视图(和适配器)列出卡片的活动。我还有一个常见的自定义菜单布局,它是在网格视图项onTouch方法上创建/显示的。对于自定义菜单中的每个项目,我再次有一个触摸监听器,我想在菜单项上发布一些操作。
这可能听起来令人困惑,所以让我解释一下我想要实现的目标。在我的主要活动中:
products
的列表,我通过JSON
api 对于显示的每个项目,我想实现ontouchlistener
,触摸时会显示3个项目的菜单。
在同一触摸上,如果触摸移动到菜单项上然后释放,我想执行某些操作。
目前我已经实现了上述功能,当我触摸列表项时,菜单会显示项目。但当我将触摸移动到项目并释放时没有任何反应。
因此永远不会触发菜单项的onTouch
方法。根据我的理解,这必须发生,因为菜单布局是在产品项目的触摸事件上创建的。
如果我使用另一个手指(当我仍然按住上一次触摸时)并且专门触摸菜单项,则会调用上面的onTouch
方法。
以下是我的代码
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// Initialize the cardMenu
// This is the menu that will be displayed
// on the touch method of each product item
CardMenu cardMenu = (CardMenu) overlayView.findViewById(R.id.card_menu);
final int menuItemLength = CARD_MENU_ITEMS.length;
for (int i = 0; i < menuItemLength; i++) {
ImageView item = new ImageView(getApplicationContext());
item.setImageResource(CARD_MENU_ITEMS[i]);
cardMenu.addItem(item, new View.OnClickListener() {
@Override
public void onClick(View v) {
Log.d("DEBUG::", "Card Menu Item Clicked");
}
}, new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
return false;
}
});
}
// Implement Grid view
adapter = new ProductAdapter(this, R.layout.grid_list_item, productList, this);
gridView = (StaggeredGridView) findViewById(R.id.grid_view);
gridView.setAdapter(adapter);
// Add click and scroll listeners to the view
gridView.setOnItemClickListener(this);
gridView.setOnScrollListener(this);
// Load the trending product data into the productList
getTrendingData();
}
RelativeLayout.OnTouchListener onImageTouch = new RelativeLayout.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
if (v == null) { return false; }
boolean defaultResult = v.onTouchEvent(event);
if (event.getAction() == MotionEvent.ACTION_DOWN) {
int currentX = (int) event.getX();
int currentY = (int) event.getY();
DisplayMetrics metrics = activity.getBaseContext().getResources().getDisplayMetrics();
int width = metrics.widthPixels;
touchX = currentX;
touchY = currentY;
touchedView = v;
// This shows the menu on the item card
showCardMenu(v, currentX, currentY);
} else if (event.getAction() == MotionEvent.ACTION_MOVE) {
return false;
} else if (event.getAction() == MotionEvent.ACTION_UP) {
hideCardMenu(); // This hides the car menu
return false;
}
return true;
}
};
public void addItem(View item, OnClickListener listener, OnTouchListener touchListener) {
cardMenuLayout.addView(item);
item.setOnClickListener(getItemClickListener(listener));
item.setOnTouchListener(getItemTouchListener(touchListener));
}
private OnClickListener getItemClickListener(final OnClickListener listener) {
return new OnClickListener() {
@Override
public void onClick(final View viewClicked) {
Log.d("DEBUG::", "CARD MENU CHILD CLICKED");
}
};
}
private OnTouchListener getItemTouchListener(final OnTouchListener listener) {
return new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
if (v == null) {return false;}
if (event.getAction() == MotionEvent.ACTION_DOWN) {
Log.d("DEBUG::", "ACTION DOWN=======");
}
if (event.getAction() == MotionEvent.ACTION_MOVE) {
Log.d("DEBUG::", "ACTION MOVE=======");
}
if (event.getAction() == MotionEvent.ACTION_UP) {
Log.d("DEBUG::", "ACTION UP=======");
}
return true;
}
};
}
所以我希望实现的流程是: