我正在开发Android应用。当我点击Recycler View中的Item时,我在打开弹出菜单时遇到了一些问题。
Show.java(包含Recycler View的Activity)。 mRecycler是与RecyclerView相关联的对象。
mRecycler.addOnItemTouchListener(new RecyclerTouchListener(getApplicationContext(), mRecycler, new RecyclerViewClickListener() {
@Override
public void onClick(View view, final int position) {
PopupMenu menu = new PopupMenu(Show.this,mRecycler);
MenuItem itemView = (MenuItem) findViewById(R.id.three);
if(method.equals("Completed"))
itemView.setTitle("Mark as imcomplete");
menu.getMenuInflater().inflate(R.menu.menu_popup,menu.getMenu());
menu.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener(){
public boolean onMenuItemClick(MenuItem item){
int id=item.getItemId();
switch (id){
case R.id.one:
Intent intent = new Intent(Show.this,Add.class);
intent.putExtra("Task",tasks.get(position));
startActivity(intent);
finish();
startActivity(getIntent());
break;
case R.id.two:
deleteRecord(position);
break;
case R.id.three:
toggleComplete(position);
}
return true;
}
});
}
@Override
public void onLongClick(View view, int position) {
onClick(view,position);
}
}));
RecyclerView xml的代码段
<android.support.v7.widget.RecyclerView
android:id="@+id/recycler"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentStart="true"
android:scrollbars="vertical"
android:clickable="true"
android:contextClickable="true"
android:longClickable="true" />
RecyclerViewClickListener.java
public interface RecyclerViewClickListener {
void onClick(View view,int position);
void onLongClick(View view,int position);
}
RecyclerTouchListener.java - 实现OnItemTouchListener的类
public class RecyclerTouchListener implements RecyclerView.OnItemTouchListener{
private GestureDetector gestureDetector;
private RecyclerViewClickListener clickListener;
public RecyclerTouchListener (Context context,final RecyclerView recyclerView,
final RecyclerViewClickListener clickListener){
this.clickListener = clickListener;
gestureDetector = new GestureDetector(context,new GestureDetector.SimpleOnGestureListener(){
@Override
public boolean onSingleTapUp(MotionEvent e){
return true;
}
@Override
public void onLongPress(MotionEvent e){
View child = recyclerView.findChildViewUnder(e.getX(),e.getY());
if (child != null && clickListener!=null)
clickListener.onLongClick(child,recyclerView.getChildAdapterPosition(child));
}
});
}
@Override
public boolean onInterceptTouchEvent(RecyclerView rv, MotionEvent e){
View child = rv.findChildViewUnder(e.getX(),e.getY());
if (child !=null && clickListener !=null && gestureDetector.onTouchEvent(e))
clickListener.onClick(child,rv.getChildAdapterPosition(child));
return false;
}
@Override
public void onTouchEvent(RecyclerView rv,MotionEvent e){}
@Override
public void onRequestDisallowInterceptTouchEvent(boolean disallowIntecept){}
}
单击RecyclerView上的项目时没有任何反应。 android系统甚至不承认它被点击了。请检查我的代码有什么问题。
答案 0 :(得分:1)
请你试试这个
mRecyclerView.addOnItemTouchListener(new RecyclerTouchListener(getApplicationContext(), mRecyclerView, new ClickListener() {
@Override
public void onClick(View view, int position) {
menuCardIndex = position;
PopupMenu popupMenu = new PopupMenu(Show.this, view);
popupMenu.setOnMenuItemClickListener(Show.this);
popupMenu.inflate(R.menu.menu_popup);
popupMenu.show();
}
@Override
public void onLongClick(View view, int position) {
}
}));
@Override
public boolean onMenuItemClick(MenuItem item) {
switch (item.getItemId()) {
case R.id.one:
Your_First_Operation;
return true;
case R.id.two:
Your_Second_Operation;
return true
case R.id.three:
Your_Third_Operation;
return true
}
return false;
}
最后把这个作为你的活动
public class Show extends AppCompactActivity implements PopupMenu.OnMenuItemClickListener
希望通过这种方式,你可以听你的点击监听器。如果它正常工作,你可以设置你的逻辑。
答案 1 :(得分:0)
如果您的RecyclerView项目的XML文件中包含“可点击”子项,请尝试声明该属性:
android:clickable="false"
仅将可点击的 true 保留在列表项的父上。
如果您不是这种情况,或者您绝对需要列表项中的可点击元素,则还有另一种解决方案。
如果您使用的是RecyclerView,则应在代码中的某处实施RecyclerView适配器。
在 OnBindViewHolder 方法中,尝试以下代码:
@Override
public void onBindViewHolder(final ViewHolder holder, int position) {
//YOUR CODE ...
holder.itemView.setOnTouchListener(yourOnTouchListener);
//MORE CODE ...
}
这将在生成列表时将OnTouchListener设置为单个ItemView。
我希望我的答案有用且可以理解。