asdfasdf
先定义一个接口:
/**
* Interface definition for a callback to be invoked when an item in this
* AdapterView has been clicked.
*/
public interface OnItemClickListener {
/**
* Callback method to be invoked when an item in this AdapterView has
* been clicked.
* <p>
* Implementers can call getItemAtPosition(position) if they need
* to access the data associated with the selected item.
*
* @param parent The RecyclerView where the click happened.
* @param view The view within the AdapterView that was clicked (this
* will be a view provided by the adapter)
* @param position The position of the view in the adapter.
* @param id The row id of the item that was clicked.
*/
void onItemClick(ViewGroup parent, View view, int position, long id);
}
复制代码
定义一个成员变量:
/**
* The listener that receives notifications when an item is clicked.
*/
private OnItemClickListener onItemClickListener;
复制代码
定义一个方法:
/**
* Register a callback to be invoked when an item in this RecyclerView has
* been clicked.
*
* @param listener The callback that will be invoked.
*/
public void setOnItemClickListener(@NonNull OnItemClickListener listener) {
onItemClickListener = listener;
}
复制代码
/**
* item点击事件监听器
*/
private class ItemClickListener implements OnItemTouchListener {
@Override
public boolean onInterceptTouchEvent(RecyclerView rv, MotionEvent e) {
if (BuildConfig.DEBUG) {
LogUtil.d("e.getX() = " + e.getX() + ", e.getY() = " + e.getY());
}
final View childView = rv.findChildViewUnder(e.getX(), e.getY());
if (childView != null && onItemClickListener != null && gestureDetector.onTouchEvent(e)) {
final int position = rv.getChildAdapterPosition(childView);
final Adapter adapter = getAdapter();
if (adapter instanceof BaseAdapter) {
final BaseAdapter baseAdapter = (BaseAdapter) adapter;
final int adjPosition = position - baseAdapter.getHeadersCount();
final int[] resIds = baseAdapter.getClickItemViewResIds();
final int count = (resIds == null || resIds.length == 0) ? 0 : resIds.length;
if (BuildConfig.DEBUG) {
LogUtil.d("Item click view count is " + count);
}
if (count > 0) {
View itemView;
for (int i = 0; i < resIds.length; i++) {
itemView = childView.findViewById(resIds[i]);
if (itemView != null) {
int[] location = new int[2];
itemView.getLocationInWindow(location); // 获取在当前窗口内的绝对坐标
if (e.getRawX() >= location[0] && e.getRawX() <= location[0] + itemView.getWidth() && e.getRawY() >= location[1] && e.getRawY() <= location[1] + itemView.getHeight()) {
return false;
} else {
if (i == count - 1) {
onItemClickListener.onItemClick(rv, childView, adjPosition, adapter.getItemId(adjPosition));
return false;
}
}
} else {
onItemClickListener.onItemClick(rv, childView, adjPosition, adapter.getItemId(adjPosition));
return false;
}
}
} else {
onItemClickListener.onItemClick(rv, childView, adjPosition, adapter.getItemId(adjPosition));
return false;
}
} else {
onItemClickListener.onItemClick(rv, childView, position, adapter.getItemId(position));
}
}
return false;
}
@Override
public void onTouchEvent(RecyclerView rv, MotionEvent e) {
}
@Override
public void onRequestDisallowInterceptTouchEvent(boolean disallowIntercept) {
}
}
复制代码