我正在开发一个简单的文件管理器。此文件管理器位于片段内,显然,它使用RecyclerView显示文件夹和文件。管理列表行的布局由以下内容组成:1 ImageView,1 TextView(显示文件夹/文件名)和一个ImageView选择选项(例如:重命名,删除等)。
要管理点击RecyclerView我实现了一个自定义的OnItemClickListener接口。代码是:
public class OnRecyclerItemClickListener implements RecyclerView.OnItemTouchListener {
GestureDetector gestureDetector;
OnItemClickListener listener;
public interface OnItemClickListener {
public void onItemClick(View view, int position);
}
public OnRecyclerItemClickListener(Context context, OnItemClickListener listener) {
this.listener = listener;
gestureDetector = new GestureDetector(context, new GestureDetector.SimpleOnGestureListener() {
@Override
public boolean onSingleTapUp(MotionEvent e) {
return true;
}
});
}
@Override
public boolean onInterceptTouchEvent(RecyclerView view, MotionEvent e) {
View childView = view.findChildViewUnder(e.getX(), e.getY());
if(childView != null && listener != null && gestureDetector.onTouchEvent(e)) {
((OnItemClickListener) listener).onItemClick(childView, view.getChildAdapterPosition(childView));
}
return false;
}
@Override
public void onTouchEvent(RecyclerView view, MotionEvent motionEvent) {
// TODO Auto-generated method stub
}
@Override
public void onRequestDisallowInterceptTouchEvent(boolean arg0) {
// TODO Auto-generated method stub
}
}
所以,在片段中:
recyclerView.addOnItemTouchListener(new OnRecyclerItemClickListener(activity, new OnRecyclerItemClickListener.OnItemClickListener() {
@Override
public void onItemClick(View view, int position) {
// TODO Auto-generated method stub
}
}));
一切正常但现在我遇到了问题:当用户点击ImageView时管理选项无法正常工作,因为RecyclerView.OnItemClickListener在imageView.setOnClickListener上获胜。当用户单击ImageView时,PopupMenu显示但是总是消失,因为同时发生RecyclerView.OnItemClickListener和ImageView.OnClickListener。第一场胜利到第二场。我怎么解决这个问题?
答案 0 :(得分:1)
您应该将您的点击功能更改为在ViewHolder
内处理,然后您可以选择放置点击监听器的位置。这样做可以让您在布局中放置一个可点击的视图,其中可点击的ImageView
位于其顶部。以下是这样做的简短示例。您需要填写空白,并正确设置Interface
。如果您需要更多帮助,请告诉我。
public interface ViewHolderListener {
void itemClicked(int position);
void imageClicked(int position);
}
public void fillView(ViewHolderItem item) {
clickableView.setOnClickListener(new View.OnClickListener {
viewHolderListener.itemClicked(getAdapterPosition());
});
yourImage.setOnClickListener(new View.OnClickListener {
viewHolderListener.imageClicked(getAdapterPosition());
});
}
答案 1 :(得分:0)
首先,您需要了解整个视图将来自Recycler View(Imageview + textview)。现在如果你想为Recycler视图和ImageView都有两个单独的事件,那么理想的方法应该是你在Recyler视图的Adapter类中写下它们而不是创建一个接口。
在适配器类中,您编写了回收器视图本身的onclick侦听器。像:
view.setonClickListener(new View.OnClickListener(){ 的onClick){} }
对于ImageView,您可以编写类似
的内容imageview.setonClickListener(new View.OnClickListener(){ 的onClick){ //此代码不会调用您的Recycler View的--View.onClick - } }
这是两者可以单独操作的唯一方式。